题意:给出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;
}