poj 2576 Tug of War
Posted ws_ccd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 2576 Tug of War相关的知识,希望对你有一定的参考价值。
还是神奇的随机算法,,(看视频说这是爬山法??)
其实就是把序列随机分成两半(我太弱,只知道random_shuffle),然后再每个序列里rand一个位置,x,y然后比较是不是交换之后是更优的。
然后重复这个过程。
神奇。。
1 #include<cstdio> 2 #include<cstring> 3 #include<ctime> 4 #include<iostream> 5 #include<algorithm> 6 #define LL long long 7 using namespace std; 8 9 int n,q[505],a[505],b[505],ans1,ans2,ans; 10 11 int main() 12 { 13 cin>>n; 14 for (int i=1; i<=n; i++) scanf("%d",&q[i]); 15 int CNT=50; 16 while (CNT--) 17 { 18 random_shuffle(q+1,q+n+1); 19 int lena=0,lenb=0,suma=0,sumb=0; 20 for (int i=1; i<=n/2; i++) a[++lena]=q[i],suma+=q[i]; 21 for (int i=n/2+1; i<=n; i++) b[++lenb]=q[i],sumb+=q[i]; 22 int cnt=10000; ans=1e9; 23 while (cnt--) 24 { 25 int x=rand()%lena+1,y=rand()%lenb+1; 26 if (abs(suma-a[x]+b[y]-(sumb-b[y]+a[x]))<abs(suma-sumb)) 27 suma=suma-a[x]+b[y],sumb=sumb-b[y]+a[x],swap(a[x],b[y]); 28 } 29 if (abs(suma-sumb)<ans) ans1=suma,ans2=sumb,ans=abs(suma-sumb); 30 } 31 if (ans1>ans2) swap(ans1,ans2); 32 printf("%d %d\n",ans1,ans2); 33 }
以上是关于poj 2576 Tug of War的主要内容,如果未能解决你的问题,请参考以下文章
lightoj-1147 - Tug of War(状压dp)