题目大意: 给n个正整数,把它们划分成尽量少的严格递增序列(前一个数必须小于后一个数)。问序列的最小个数和这些序列。
分析:很容易想到最小次数就是数列中重复出现最多的数的出现次数,然后这道题输出方案上有些技巧,每次输出序列下标膜ans同余的子序列,这样肯定可以完全按升序分割掉
整个序列。
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10001
using namespace std;
int n,a[MAXN];
int main()
{
while(scanf("%d",&n) && n)
{
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
int num = 1,ans = 0;
for(int i = 1;i <= n;i++)
{
if(a[i] == a[i-1]) num++;
else num = 1;
ans = max(ans,num);
}
printf("%d\n",ans);
for(int i = 1;i <= ans;i++)
{
for(int j = i;j <= n;j += ans)
if(j + ans <= n) printf("%d ",a[j]);
else printf("%d",a[j]);
printf("\n");
}
}
}