贪心,类似于“陶瓷娃娃”,可以想一下,如果全是不同规格的背包,那么他们就可以依据大小关系一个套一个全部套进一个包中。
因此,包的个数取决于重复次数最多的那个规格的包,这个题难点在于怎么将其按套件输出,这里可以在排序之后从最大的依次开始往后输出,每次输出的序列以最大重复次数为公差依次向前输出直到序数小于0为止。
不过在这里还是WA了一次,看到样例都是输出的一对一对的数字,本还以为是只输出每对套层最外层的那两层,结果WA了,检查半天都不知道怎么回事,最后看了别人的代码,才意识到理解错题意了。
因此,包的个数取决于重复次数最多的那个规格的包,这个题难点在于怎么将其按套件输出,这里可以在排序之后从最大的依次开始往后输出,每次输出的序列以最大重复次数为公差依次向前输出直到序数小于0为止。
不过在这里还是WA了一次,看到样例都是输出的一对一对的数字,本还以为是只输出每对套层最外层的那两层,结果WA了,检查半天都不知道怎么回事,最后看了别人的代码,才意识到理解错题意了。
代码如下:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int a[1000002], b[1000002];
int main()
{
#ifdef test
freopen("in.txt", "r", stdin);
#endif
int num, flag = 0;
while(scanf("%d", &num), num)
{
if(flag)
puts("");
for(int i = 0; i < num; i++)
scanf("%d", &a[i]);
memset(b, 0, sizeof(b[0]) * (num) + 1);
qsort(a, num, sizeof(a[0]), cmp);
int fn = a[0], fct = 1, fmax = 1;
for(int i = 1; i < num; i++)
{
if(a[i] == fn)
++fct;
else
{
fn = a[i];
fct = 1;
}
if(fmax < fct )
fmax = fct;
}
printf("%d\n", fmax);
for(int i = num - 1, cct = 0; cct < fmax; i--)
{
if(i - fmax >= 0)
printf("%d %d\n", a[i], a[i - fmax]);
else
printf("%d\n", a[i]);
++cct;
}
flag = 1;
}
return 0;
}