poj 2454 Jersey Politics

http://poj.org/problem?id=2454

随机化 

先从大到小排序 最后k个舍去

把前2×k个分成两组然后不断交换两组的第随机产生个 元素

知道满足条件

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<ctime>

#include<queue>

#include<cstring>

#include<set>

#include<cmath>

#include<algorithm>



using namespace std;



const int N=605;

struct node

{

    int I;

    int num;

}cow[N];

bool had[N];

bool cmp(node a,node b)

{

    return a.num>b.num;

}

int main()

{

    freopen("data.txt","r",stdin);

    srand((unsigned)time(NULL));

    int n;

    //while(scanf("%d",&n)!=EOF)

    {

        scanf("%d",&n);

        for(int i=0;i<n*3;++i)

        {

            scanf("%d",&cow[i].num);

            cow[i].I=i+1;

        }

        sort(cow,cow+n*3,cmp);

        int sum1=0;

        int sum2=0;

        for(int i=0;i<n;++i)

        sum1+=cow[i].num;

        for(int i=n;i<n*2;++i)

        sum2+=cow[i].num;

        while(1)

        {

            if(sum1>n*500&&sum2>n*500)

            break;

            int i=rand()%n;

            int j=rand()%n+n;

            sum1=sum1-cow[i].num+cow[j].num;

            sum2=sum2-cow[j].num+cow[i].num;

            swap(cow[i].I,cow[j].I);

            swap(cow[i].num,cow[j].num);

        }

        for(int i=0;i<n*3;++i)

        printf("%d\n",cow[i].I);

    }

    return 0;

}

 

 

你可能感兴趣的:(jersey)