给跪了..这个构造法...
最小的序列还是很好求的(顺便吐槽一下白书上的翻译有歧义把..怎么是划分呢..)
但是关于方案的输出, 本来想用个vector<pair<int, int> >暴力维护的,
结果看了网上的代码,
利用性质就行了啊!
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 #include <vector>
6 using namespace std;
7 typedef pair<int, int> P;
8 const int MAXN = 1e4 + 20;
9
10 int N;
11 int a[MAXN];
12
13 int main()
14 {
15 //freopen("11100.in", "r", stdin);
16 //freopen("11100.out", "w", stdout);
17 while(cin>>N, N)
18 {
19 for(int i = 1; i <= N; i++)
20 scanf("%d", &a[i]);
21 sort(a + 1, a + N + 1);
22 int maxk = 1; P tmp(0, 0);
23 for(int i = 1; i <= N; i++)
24 if(a[i] == tmp.first){
25 tmp.second++;
26 maxk = max(maxk, tmp.second);
27 }
28 else tmp.second = 1, tmp.first = a[i];
29 printf("%d
", maxk);
30 for(int i = 1; i <= maxk; i++)
31 {
32 printf("%d", a[i]);
33 for(int j = i + maxk; j <= N; j += maxk)
34 printf(" %d", a[j]);
35 printf("
");
36 }
37 puts("");
38 }
39 return 0;
40 }