UVA_11100
首先,pieces的数目是取决于出现的次数最多的数的,出现次数最多的数的出现次数就是pieces的数目。
剩下还要保证每个pieces里面盒子数的最大值要尽量小,那么可以直接将盒子按大小排序,然后将每个盒子按1,2,...,n,1,2,...n...的顺序依次放到每个piece中,就可以构造出一个符合题意的放置方案了,其中n表示pieces的数目。
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> #define MAXN 10010 int a[MAXN], N; void input() { for(int i = 0; i < N; i ++) scanf("%d", &a[i]); std::sort(a, a + N); } void process() { int cur = 0, n = 0; std::vector<int> b[MAXN]; while(cur < N) { int pre = cur; while(cur < N && a[cur] == a[pre]) ++ cur; n = std::max(n, cur - pre); } for(int i = 0; i < N; i ++) b[i % n].push_back(a[i]); printf("%d\n", n); for(int i = 0; i < n; i ++) { printf("%d", b[i][0]); for(int j = 1; j < b[i].size(); j ++) printf(" %d", b[i][j]); printf("\n"); } } int main() { int t = 0; while(scanf("%d", &N), N) { input(); if(t ++) printf("\n"); process(); } return 0; }