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

posted @ 2014-10-01 17:25  zball  阅读(164)  评论(0编辑  收藏  举报