POJ 2454 Jersey Politics 解题报告(随机化)

    题目大意:给定3*k个数字,分为3组,至少让两组中数字的和大于500*k。

    解题报告:随机化算法。首先可以排序,让和最小的数字分为一组,即使另外两组的和必须大于500k。

    然后就随机交换两组的数字。当满足要求时打印顺序即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <ctime>
using namespace std;

struct Node
{
    int index;
    int val;
    bool operator<(const Node& cmp) const
    {
        return val<cmp.val;
    }
} node[180];

int main()
{
    srand((unsigned)time(0));

    int k;
    scanf("%d",&k);

    int n=k*3;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&node[i].val);
        node[i].index=i;
    }

    sort(node,node+n);

    int UP=k*500;
    int k2=k*2;

    int sum1=0,sum2=0;
    for(int i=k;i<k2;i++)
        sum1+=node[i].val;
    for(int i=k2;i<n;i++)
        sum2+=node[i].val;

    while(sum1<=UP || sum2<=UP)
    {
        int p=rand()%k+k;
        int q=rand()%k+k2;

        int sub=node[p].val-node[q].val;
        sum1-=sub;
        sum2+=sub;
        swap(node[p],node[q]);
    }

    for(int i=0;i<n;i++)
        printf("%d\n",node[i].index+1);
}


你可能感兴趣的:(随机化)