最后的包数取决于所有包中出现最多的那一种规格
输出的时候,每次选取ans+j为下一个位置
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int arr[10000 + 10], cnt[1000000 + 10];
int main() {
int n, tmp, ans, firstcase = 1;
while(scanf("%d", &n) == 1 && n) {
ans = 0;
if(firstcase) {
firstcase = 0;
} else {
printf("\n");
}
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i < n; ++i) {
scanf("%d", &arr[i]);
cnt[arr[i]]++;
ans = ans > cnt[arr[i]] ? ans : cnt[arr[i]];
}
sort(arr, arr + n);
printf("%d\n",ans);
for(int i = 0; i < ans; ++i) {
int first = 1;
for(int j = i; j < n; j += ans) {
if(first) {
first = 0;
} else {
printf(" ");
}
printf("%d", arr[j]);
}
printf("\n");
}
}
return 0;
}