1.题面
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21322
2.题意
给你n个数字,
1.把他们分成尽可能少的严格递增序列
2.在保证序列数尽可能少的情况下,希望能使元素最多的序列中的元素数量尽可能少
3.思路
排序后得到序列a
统计处每个元素的数量s[i],显而易见max(s[i])是第一个输出
设 k = max(i)
从0~k中的a[i]以k为间隔输出元素知道序列末尾
显而易见输出有k行
又因为k = max(i),所以序列必然是递增的
4.代码
/*****************************************************************
> File Name: Cpp_Acm.cpp
> Author: Uncle_Sugar
> Mail: uncle_sugar@qq.com
> Created Time: 2016年05月11日 星期三 21时36分19秒
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;
const int debug = 1;
const int size = 100000 + 10;
const int INF = INT_MAX>>1;
typedef long long ll;
int arr[size];
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
int i,j;
int n,ncase=0;
while (cin>>n&&n){
if (ncase++)
cout << '\n';
for (i=0;i<n;i++){
cin >> arr[i];
}
sort(arr,arr+n);
int ans = 0,cnt = 1;
for (i=1;i<n;i++){
if (arr[i]==arr[i-1])
cnt++;
else
cnt = 1;
ans = max(ans,cnt);
}
cout << ans << endl;
for (i=0;i<ans;i++){
for (j=i;j<n;j+=ans){
cout << arr[j] << (j+ans>=n?'\n':' ');
}
}
}
return 0;
}