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 |
我用随机过的,我想这样应该正确1.就是每次在两个数组里面分别取出两个随机数,如果交换后能使二者差的绝对值减少,就交换; 2.当然,有可能只需交换一个数,所以我在两个数组里面分别加入了一个0 3.至于证明,我想可以用数学归纳法。 #include<iostream.h> #include<stdlib.h> #include<stdio.h> int a[64],b[64]; int AS(int x) { return x<0?-x:x; } void input(int &n,int a[],int &s) { for(int i=s=0;i<n;i++) { cin>>a[i]; s+=a[i]; } a[n]=0; n++; } compare(const void *e1,const void *e2) { return *(int *)e1-*(int *)e2; } void change(int i,int j) { int t=a[i]; a[i]=b[j]; b[j]=t; } void main() { int n,i1,i2,j1,j2,t,an,bn,sa,sb,d1,d2; cin>>n; an=n/2; bn=n-an; input(an,a,sa); input(bn,b,sb); qsort(a,an,sizeof(a[0]),compare); qsort(b,bn,sizeof(b[0]),compare); for(t=0;t<10000;t++) { i1=i2=rand()%an; while(i2==i1)i2=rand()%an; j1=j2=rand()%bn; while(j2==j1)j2=rand()%bn; if(((a[i1]==0)+(a[i2]==0)+(b[j1]==0)+(b[j2]==0))%2!=0)continue; d1=AS(sa-sb); d2=AS(sa-sb-(a[i1]+a[i2]-b[j1]-b[j2])*2); if(d1>d2) { sa-=(a[i1]+a[i2]-b[j1]-b[j2]); sb-=-(a[i1]+a[i2]-b[j1]-b[j2]); change(i1,j1); change(i2,j2); } } if(sa<=sb)cout<<sa<<' '<<sb<<endl; else cout<<sb<<' '<<sa<<endl; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator