题目大意:
有几个包裹,包裹之间是有互相包含关系的,求最少的箱子数可以将所有包裹都放进去。
思路:
最多的重复个数k就需要几个箱子,因为相同的之间是不可以相互包含的。将包裹进行排序,然后从一个数i,每加K就是放在同一个箱子中的,照着这个样子输出就可以了。
代码:
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
int num[10003];
int vis[10003];
int main() {
int N,count1,_max;
bool first= true;
while(scanf("%d",&N)!=EOF && N) {
memset(vis,0,sizeof(vis));
memset(num,-1,sizeof(num));
for(int i = 0 ; i < N; i++) {
scanf("%d",&num[i]);
}
sort(num,num+N);
count1 = 1;
_max = 0;
for(int k = 0; k < N;k++) {
if(num[k] == num[k + 1]) {
count1++;
}
else {
if(count1 > _max) {
_max = count1;
}
count1 = 1;
}
}
if(first)
first = false;
else
printf("\n");
printf("%d\n",_max);
for(int i = 0 ; i < _max ;i++) {
/* if(!vis[i]) {
int t = i;
while(1) {
if(t - _max < 0)
break;
printf("%d ",num[t]);
vis[t] = 1;
t = t - _max;
}
vis[t] = 1;
printf("%d\n",num[t]);
}*/
for(int j = i; j < N; j += _max)
printf("%s%d",(i == j)?"":" ",num[j]);
printf("\n");
}
}
return 0 ;
}