题意:
将所有包归为几堆,每堆包大小不重,求最少分堆的方式。
思路:
既求最少分堆且每个堆没有大小一样的包,那么堆数至少得是最大包重复量,取包时,隔最大重复数绝不会重(排好序后)
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10005;
int b[maxn];
int main() {
int n, first=1;
while(scanf("%d", &n) && n) {
for(int i=0; i<n; i++) {
scanf("%d", &b[i]);
}
sort(b, b+n);
int ans = 1, m = 0;
for(int i=0; i<n-1; i++) {
if(b[i] == b[i+1]) ans++;
else {
if(m < ans)
m = ans;
ans = 1;
}
if((i+1 == n-1) && ans > m) m = ans;
}
if(first) first = 0;
else printf("\n");
printf("%d\n", m);
for(int i=0; i<m; i++) {
int h = i;
for(int j=0; j<n/m+n%m && h<n; j++) {
if(h==i)
printf("%d", b[h]);
else printf(" %d", b[h]);
h += m;
}
printf("\n");
}
}
return 0;
}