首页 > 代码库 > poj 2576 Tug of War
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。