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