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; }