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;}

原创粉丝点击