首页 > 代码库 > 07 DAY 1

07 DAY 1

壮烈的一天。。。

第一题

本意是水题,然后写了块状数组模拟,最后发现算法错了。。。

然后其实快排一遍扫一遍完事。。。 100分

#include <cstdio>#include <algorithm>#define min(a,b) ((a)<(b)?(a):(b))struct node{	int a,b;} d[400000];int i,n,a,b,l,m,j,k;int pl;bool cmp(node a,node b){	return a.a<b.a;}int main(){	freopen("cut.in","r",stdin);	freopen("cut.out","w",stdout);	scanf("%d",&n);	for(i=0;i<n;++i){		scanf("%d%d",&a,&b);		d[i].a=a;		d[i].b=b;	}	std::sort(d,d+n,cmp);	pl=n;	for(i=0;i<pl;++i){		j=i-1,k=i+1;		if(k==pl) b=10000000; else b=d[k].a-d[i].a;		if(j<0) a=10000000; else a=d[i].a-d[j].a;		l+=d[i].b-min(min(a,b),d[i].b);	}	printf("%d\n",l);	return 0;}

第二题

我等蒟蒻只能爆搜骗分 30分

#include <cstdio>int a[40],n,p,c,i;unsigned int k;void search(int f,int s){//大神我的大法师哪儿错了?	if(f==n){		if(s==c) ++k;		return;	}	search(f+1,s);	search(f+1,(s*a[f+1])%p);}int main(){	freopen("count.in","r",stdin);	freopen("count.out","w",stdout);	scanf("%d %d %d",&n,&p,&c);	for(i=0;i<n;++i) scanf("%d",a+i);	search(0,1);	search(0,a[0]);	printf("%d",k%1000000007);	return 0;}

第三题

果然是太弱了。。。只会二分答案贪心检验 40分代码

#include <cstdio>int n,s,i,f[2000],k,ans,left,right,mid,last,t;bool ok(int p){	last=0;	t=s-f[0]+15;	if(t<=0)return false;	for(i=1;i<n;++i){		t-=f[i];		if(i==last+p){			t+=p*15;			last=i;		}		if(t<=0) return false;	}	return true;}int main(){	freopen("magic.in","r",stdin);	freopen("magic.out","w",stdout);	scanf("%d %d",&n,&s);	for(i=0;i<n;++i){		scanf("%d",f+i);		k+=f[i];	}	if(k<s){		printf("No upper bound.");		return 0;	}	if(!ok(1)){		printf("-1\n");		return 0;	}	ans=0;	left=1;	right=n;	while(left<=right){		mid=(left+right)/2;		if(ok(mid)){			ans=mid;			left=mid+1;		}else{			right=mid-1;		}	}	printf("%d\n",ans);	return 0;}

最后无限膜拜L.Z.W大神 @vb4896

07 DAY 1