zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    01前端-html
    2-3程序流程
    2-2视频缓存池
    2-1图像像素格式深度理解
    3.1.1 文件系统介绍
    3.1.4 文件属性
    CentOS开放端口的方法
    宝塔linux面板命令大全
    如何卸载Win10 RS3上预装的office2016
    win10家庭版升级专业版的两种方法和密钥
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6731438.html
Copyright © 2011-2022 走看看