• 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
    ",ans1,ans2);
    33 }
  • 相关阅读:
    BCTF赛后
    有道前端面试总结
    来更新一篇blog吧
    好久没更新了,开学新气象
    leetcode--N-Queens II
    leetcode--N-Queens
    leetcode--Scramble String
    leetcode--Maximal Rectangle
    leetcode--Distinct Subsequences
    leetcode--Sudoku Solver
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6731439.html
Copyright © 2020-2023  润新知