题意:
给定3*k个数字,将其划分为等长的三个子序列,要求其中至少有两个子序列各自加和大于500*K,求满足上述条件的一个划分。
分析:
从大到小进行排序,取出前 2*K个 数字,分成两组,每次分别随机从两个组中取出两个元素进行交换,进行条件检测。
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<climits>
#include<cstdlib>
using namespace std;
struct node{
int val;
int key;
}a[200];
bool cmp(node x,node y){
return x.val>y.val;
}
int main(){
int k;
scanf("%d",&k);
int flag=500*k;
for(int i=0;i<3*k;i++){
scanf("%d",&a[i].val);
a[i].key=i+1;
}
sort(a,a+3*k,cmp);
int sum1=0,sum2=0;
for(int i=0;i<k;i++){
sum1+=a[i].val;
sum2+=a[i+k].val;
}
srand((unsigned int)time(0));
while(!(sum1>flag&&sum2>flag)){
int offset1=rand()%k;
int offset2=rand()%k;
sum1=sum1-a[offset1].val+a[offset2+k].val;
sum2=sum2-a[offset2+k].val+a[offset1].val;
swap(a[offset1],a[offset2+k]);
}
for(int i=0;i<3*k;i++){
printf("%d\n",a[i].key);
}
return 0;
}