题目大意:给定3*k个数字,分为3组,至少让两组中数字的和大于500*k。
解题报告:随机化算法。首先可以排序,让和最小的数字分为一组,即使另外两组的和必须大于500k。
然后就随机交换两组的数字。当满足要求时打印顺序即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <ctime>
using namespace std;
struct Node
{
int index;
int val;
bool operator<(const Node& cmp) const
{
return val<cmp.val;
}
} node[180];
int main()
{
srand((unsigned)time(0));
int k;
scanf("%d",&k);
int n=k*3;
for(int i=0;i<n;i++)
{
scanf("%d",&node[i].val);
node[i].index=i;
}
sort(node,node+n);
int UP=k*500;
int k2=k*2;
int sum1=0,sum2=0;
for(int i=k;i<k2;i++)
sum1+=node[i].val;
for(int i=k2;i<n;i++)
sum2+=node[i].val;
while(sum1<=UP || sum2<=UP)
{
int p=rand()%k+k;
int q=rand()%k+k2;
int sub=node[p].val-node[q].val;
sum1-=sub;
sum2+=sub;
swap(node[p],node[q]);
}
for(int i=0;i<n;i++)
printf("%d\n",node[i].index+1);
}