题意:给你n个数字,代表n个包的大小。小的包可以嵌套在大的包里,现在使这些包进行嵌套,使得到最少的包。
方法:找到重复次数最多的数字,包裹数就是重复的次数k。稍微难的是包裹嵌套的输出。一个要求就是这些包裹肯定不能重复,既不能有两个2等。可以想到等差数列,让公差就是k,这样重复最多的数字都不会重复,其他的就更不会重复了。
#include#include #include #include #include #include #include #include #include #include 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; }