今天模拟赛考了这题,一周前我才做的,心里美滋滋,结果挂了。。
这题的思想就是分组。怎么分组?显然分成的最小组数就是最大值。
由于每次我们最多选这个数之后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 }