题解UVA11100 The Trip, 2007

今天模拟赛考了这题,一周前我才做的,心里美滋滋,结果挂了。。

这题的思想就是分组。怎么分组?显然分成的最小组数就是最大值。

由于每次我们最多选这个数之后Maxn个数和它分在一组(否则有可能重复),每次从1~maxn循环,往后找Maxn个即可。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 #define it register int
 5 #define il inline
 6 using namespace std;
 7 const int N=1000005;
 8 int n,a[N],cnt[N]; 
 9 il void fr(int &num){
10     num=0;char c=getchar();int p=1;
11     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
12     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
13     num*=p;
14 }
15 il int Max(it p,it q){
16     return p>q?p:q;
17 }
18 int main(){
19     bool fl=0;
20     while(scanf("%d",&n)!=EOF){
21         if(!n) break;
22         if(fl) putchar('
');
23         fl=true;
24         it ans=0;
25         for(it i=1;i<=n;++i) fr(a[i]),++cnt[a[i]],ans=Max(ans,cnt[a[i]]);
26         sort(a+1,a+1+n);
27         printf("%d
",ans); 
28         for(it i=1;i<=ans;++i){
29             printf("%d",a[i]),cnt[a[i]]=0;
30             for(it j=i+ans;j<=n;j+=ans)
31                 printf(" %d",a[j]),cnt[a[j]]=0;
32             putchar('
');
33         } 
34     }
35     return 0;
36 }
View Code
原文地址:https://www.cnblogs.com/Kylin-xy/p/11622963.html