CodeVs 1959 拔河比赛 : 随机化贪心

题目大意:有n个人, 每个人有自己的体重, 要求选出两队人, 人数差不超过1, 且重量差最小, 求出两队体重和;

其实很明白是DP, 但是DP状态转移方程却不太好想;

琢磨半天, 想到了随机化!!

贪心的去想 : 我们把n个人分成两份, 然后得出正确答案, 虽然可能一次达到正解的概率只有0.1%?, 但是重复无数次(不超时), 几乎可以达到100%!!!;

 不说了, 看代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;

int n, sum;
int a[105];
int ans1 = 1e9, ans2 = -1e9;

inline void Init()
{
    for(register int i = 1 ; i <= n ; i ++)
    {
        int t  = rand() % n + 1;;    
        int tmp = a[t];
        a[t] = a[i];
        a[i] = tmp;
    }
}

inline void Work()
{
    int s1 = 0, s2 = 0;
    for(register int i = 1 ; i <= n / 2 ; i ++)
    {
        s1 += a[i];
    }
    s2 = sum - s1;
    
    if(abs(s1 - s2) < abs(ans1 - ans2))  
    {
        ans1 = min(s1, s2);
        ans2 = max(s1, s2);
    }
}

int main()
{
    
    srand(23433);
    
    cin >> n;
    
    for(register int i = 1 ; i <= n ; i ++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    
    for(register int i = 1 ; i <= 100000 ; i ++)
    {
        Init();
        Work();
    }
    
    printf("%d %d\n", ans1, ans2);
    return 0;
}
zZhBr

猜你喜欢

转载自www.cnblogs.com/zZh-Brim/p/8933865.html
今日推荐