首页 > 其他 > 详细

poj 2576 Tug of War

时间:2017-04-19 10:03:53      阅读:188      评论:0      收藏:0      [点我收藏+]

还是神奇的随机算法,,(看视频说这是爬山法??)

其实就是把序列随机分成两半(我太弱,只知道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

原文:http://www.cnblogs.com/ccd2333/p/6731438.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!