题意:给出N个包的尺寸,一个包可以装在另一个包里面,输出最后最少的包数k,同时让一个包里面的包尽量少。
最少的包数就是出现次数最多的包。
然后输出我就不会了。。。
参考了synapse7的解题报告。
原来按间隔k输出就行。这样既保证了不会重复装,又让一个包里面的数目平均,很巧妙的思路。学习了。
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
int bag[11000];
int main()
{
//freopen("input.txt", "r", stdin);
int i, j, n, k;
map<int, int> mp;
while (scanf("%d", &n), n)
{
k = -1;
mp.clear();
for (i = 0; i < n; i++)
{
scanf("%d", &bag[i]);
mp[bag[i]]++;
k = max(mp[bag[i]], k);
}
sort(bag, bag + n);
printf("%d\n", k);
for (i = 0; i < k; i++)
{
printf("%d", bag[i]);
for (j = i + k; j < n; j += k)
printf(" %d", bag[j]);
printf("\n");
}
}
return 0;
}