uva11100
来源:互联网 发布:win7不能启用网络发现 编辑:程序博客网 时间:2024/05/21 14:04
//从题目可以肯定,最多的包裹数一定是同一种大小包裹数最多的一种。//用multimap维护当前包裹数最多的大小。#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <stack>#define pii pair<int,int>#define MP make_pairusing namespace std;int main(){ int n; while(scanf("%d",&n)!=EOF,n) { map<int,int>::iterator it; multimap<int,int>::reverse_iterator rit; map<int,int>Map; multimap<int,int>Map_index; int Max=0; for(int i=0;i<n;i++) { int temp; scanf("%d",&temp); Map[temp]++; if(Map[temp]>Max) Max=Map[temp]; } for(it=Map.begin();it!=Map.end();++it) Map_index.insert(MP(it->second,it->first)); printf("%d\n",Max); bool flag=n%Max; int s=n/Max+flag; while(Max--) { stack<pii>stk; int sum=1; for(rit=Map_index.rbegin();rit!=Map_index.rend();++rit) { stk.push(*rit); if(sum++>=s) break; } while(!stk.empty()) { pii now=stk.top(); stk.pop(); multimap<int,int>::iterator pos=Map_index.find(now.first); for(pos;pos!=Map_index.end();++pos) if(pos->second==now.second) break; Map_index.erase(pos); printf("%d",now.second); if(stk.empty()) putchar('\n'); else putchar(' '); pii next=now; next.first--; if(next.first) Map_index.insert(next); } } } return 0;}