思路:
首先按照 J牛 的数量排序,最小的前 K 个肯定是一个组了。反正这组都是输的,多烂都行。
剩下的 2K 个元素,和肯定是超过 2K*500 的。问题就是要划分一下,让每个组的和都大于 K*500。
这里没有说一定要平均分,也没说要满足什么其他特殊条件,而且数据又特别小。
所以就可以随机的分别挑选两个元素交换,然后看是否满足条件了。
代码居然 0MS AC了,随机的威力很大啊,只是不可能题题都用罢了。。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int K, in[256], *ptr[256];
int cmp(const void *a, const void *b)
{
return *(*(int **)a) - *(*(int **)b);
}
__inline void swap(int **a, int **b)
{
int *t = *a;
*a = *b;
*b = t;
}
int main()
{
int i, sa, sb, a, b;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d", &K);
for (i = 0; i < 3*K; i++) {
scanf("%d", &in[i]);
ptr[i] = &in[i];
}
qsort(ptr, 3*K, sizeof(ptr[0]), cmp);
sa = 0;
for (i = K; i < 2*K; i++)
sa += *ptr[i];
sb = 0;
for (i = 2*K; i < 3*K; i++)
sb += *ptr[i];
while (1) {
a = (rand() % K) + K;
b = (rand() % K) + 2*K;
sa = sa - *ptr[a] + *ptr[b];
sb = sb - *ptr[b] + *ptr[a];
swap(&ptr[a], &ptr[b]);
if (sa > 500*K && sb > 500*K)
break;
}
for (i = 0; i < 3*K; i++)
printf("%d\n", ptr[i] - in + 1);
return 0;
}