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 }

 

posted @ 2017-04-19 07:26  ws_ccd  阅读(136)  评论(0编辑  收藏  举报