题目链接:UVA - 11100
题意描述:n个旅行箱,形状相同,尺寸不同,尺寸小的可以放在尺寸大的旅行箱里。现在要求露在最外面的旅行箱的数量最少的同时满足一个旅行箱里放的旅行箱的数量最少。求出这样满足要求的任意一种方案。
算法分析:首先我们可以确定最少的旅行箱的数量cnt:即n个旅行箱里按照尺寸大小分类(尺寸相同的在同一类),数量最多的那一类的数量。然后把cnt看成有cnt个堆,第二个要求就是要让这cnt个堆里最大旅行箱数量最小,直接用vector处理即可。
等AC之后突然想到,三个旅行箱尺寸大小为2,2,4,那么就可以把前两个放在最后一个呀,但答案不是这样的。-_-
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#define inf 0x7fffffff
using namespace std;
const int maxn=+;
const int M = +; int n,an[maxn];
int vis[M],num[maxn];
vector<int> vec[maxn]; int main()
{
int ok=;
while (scanf("%d",&n)!=EOF && n)
{
if (ok) printf("\n");
ok=;
memset(vis,,sizeof(vis));
for (int i= ;i<maxn ;i++) vec[i].clear();
int cnt=,maxSize=;
for (int i= ;i<=n ;i++)
{
scanf("%d",&an[i]);
vis[an[i] ]++;
cnt=max(cnt,vis[an[i] ]);
maxSize=max(maxSize,an[i]);
}
sort(an+,an+n+);
int c=;
for (int i= ;i<=n ;i++)
{
vec[c].push_back(an[i]);
c=(c+)%cnt;
}
printf("%d\n",cnt);
for (int i= ;i<cnt ;i++)
{
int k=vec[i].size();
printf("%d",vec[i][]);
for (int j= ;j<k ;j++) printf(" %d",vec[i][j]);
printf("\n");
}
}
return ;
}