Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
帮忙优化啊!!!#include <iostream.h> #define k 500 bool a[1000],v[1000][25]; int b[1000][25],sum[1000][25]; int d[210],p[210],c[210],e[210],play[210]; int n,m,dmax,pmax; void sort(int h,int l); void done(void); void work(int pp[210]); void print(int num,int step); void main() { int i,j,step,h; step=0; cin>>n>>m; while (n>0) { step++; cout<<"Jury #"<<step<<endl; for(i=1;i<=n;i++) { play[i]=i; cin>>d[i]>>p[i]; c[i]=d[i]-p[i]; } for(i=1;i<=n;i++) e[i]=d[i]+p[i]; sort(1,n); for(i=1;i<=n;i++) b[i][0]=play[i]; done(); work(play); cout<<"Best jury has value "<<pmax<<" for prosecution and value "<<dmax<<" for defence:"<<endl; for(i=1;i<m;i++) for(j=i+1;j<=m;j++) if (e[j]<e[i]) { h=e[j]; e[j]=e[i]; e[i]=h; } for(i=1;i<=m;i++) cout<<" "<<e[i]; cout<<endl; cout<<endl; cin>>n>>m; } } void sort(int h,int l) { int i,j,mid,g; i=h; j=l; mid=c[(i+j)/2]; do { while ((c[i]<mid) && (i<l)) i++; while ((c[j]>mid) && (j>h)) j--; if (i<=j) { g=c[i]; c[i]=c[j]; c[j]=g; g=e[i]; e[i]=e[j]; e[j]=g; g=play[i]; play[i]=play[j]; play[j]=g; i++; j--; } }while (i<=j); if (i<l) sort(i,l); if (j>h) sort(h,j); } void done(void) { int i,j,l,h,num,u,min,max; for(i=100;i<=1000;i++) { a[i]=false; for(j=1;j<=23;j++) { sum[i][j]=0; v[i][j]=false; } } num=c[1]+k; b[num][1]=1; v[num][1]=true; sum[num][1]+=e[1]; a[num]=true; h=num; l=num; min=num; max=num; for(i=2;i<=n;i++) { for(j=h;j<=l;j++) if (a[j]) { if (j+c[i]<min) min=j+c[i]; if (j+c[i]>max) max=j+c[i]; for(u=1;u<m;u++) if ((v[j][u]) && (!v[j+c[i]][u+1])) { v[j+c[i]][u+1]=true; b[j+c[i]][u+1]=i; sum[j+c[i]][u+1]=sum[j][u]+e[i]; } else if ((v[j][u]) && (v[j+c[i]][u+1]) && (sum[j][u]+e[i]>sum[j+c[i]][u+1])) { b[j+c[i]][u+1]=i; sum[j+c[i]][u+1]=sum[j][u]+e[i]; } } if (c[i]<0) for(j=h;j<=l;j++) if (a[j]) a[j+c[i]]=true; if (c[i]>0) for(j=l;j>=h;j--) if (a[j]) a[j+c[i]]=true; num=c[i]+k; if (num>max) max=num; if (num<min) min=num; a[num]=true; if (((v[num][1]) && (sum[num][1]<e[i])) || (!v[num][1])) { v[num][1]=true; sum[num][1]=e[i]; b[num][1]=i; } h=min; l=max; if (h<100) h=100; if (l>800) l=800; } } void work(int pp[210]) { int i; for(i=0;i<401;i++) if ((v[k+i][m]) || (v[k-i][m])) break; if (sum[k+i][m]>sum[k-i][m]) print(k+i,1); else print(k-i,1); pmax=0; dmax=0; for(i=1;i<=m;i++) { e[i]=b[e[i]][0]; pmax+=p[e[i]]; dmax+=d[e[i]]; } } void print(int num,int step) { if (step<=m) { e[step]=b[num][m-step+1]; num=num-c[e[step]]; print(num,step+1); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator