题意:给你n个数字,代表n个包的大小。小的包可以嵌套在大的包里,现在使这些包进行嵌套,使得到最少的包。
方法:找到重复次数最多的数字,包裹数就是重复的次数k。稍微难的是包裹嵌套的输出。一个要求就是这些包裹肯定不能重复,既不能有两个2等。可以想到等差数列,让公差就是k,这样重复最多的数字都不会重复,其他的就更不会重复了。
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
const int maxn = 10000+10;
const int N = 1000000+10;
int num[N], a[maxn];
int main()
{
#ifdef Local
freopen("a.in", "r", stdin);
#endif
int n = 0;
while (cin >> n && n)
{
int i = 0, max = 0;
memset(num, 0, sizeof(num));
for (i = 0; i < n; i++)
{
cin >> a[i];
num[a[i]]++;
if (num[a[i]] > max)
{
max = num[a[i]];
}
}//得到重复次数最多的。
sort(a, a+n);
cout << max << endl;
for (i = 0; i < max; i++)
{
int j = i;
cout << a[j];
for (j += max; j < n; j += max)
cout << " " << a[j];
cout << endl;
}
}
return 0;
}