POJ 2454 Jersey Politics 分组问题 随机化算法

来源:互联网 发布:amd处理器优化 编辑:程序博客网 时间:2024/04/30 02:04

题意:给出3*k个数,将它们分成三分,每份k个数,要求至少存在有两份,使得每一份的k个数的和大于500*k。

思路:

先从大到小的进行排序,然后只需要将前2*n大的数进行随机的分配成两组就行了。

#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <ctime>#include <map>#include <queue>#define LL long long#define INF 0x3f3f3f3f#define bug puts("***************")using namespace std;const int N =1100;struct node{    int id,val;    friend bool operator <(node p1,node p2){        return p1.val>p2.val;    }}a[N*3];;int main(){    int n;    srand((unsigned)time(NULL));    scanf("%d",&n);    for(int i=0;i<3*n;i++){        scanf("%d",&a[i].val);        a[i].id=i;    }    sort(a,a+n*3);    int s1=0,s2=0;    for(int i=0;i<n;i++){        s1+=a[i].val;    }    for(int i=n;i<2*n;i++){        s2+=a[i].val;    }    while(s1<=500*n||s2<=500*n){        int k1=rand()%n;        int k2=rand()%n+n;        s1=s1-a[k1].val+a[k2].val;        s2=s2-a[k2].val+a[k1].val;        swap(a[k1],a[k2]);    }    for(int i=0;i<3*n;i++){        printf("%d\n",a[i].id+1);    }    return 0;}


0 0