您的位置:首页 > 其它

UVA - 11100 The Trip, 2007

2016-05-11 21:50 274 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: