zoukankan      html  css  js  c++  java
  • UVA11100旅行(大包装小包,问最少多少个包)

    题意:
           有n个包裹,每个包裹的大小都给出了,然后小的包裹可以装到大的包裹里,问最少装成多少个包裹,装成最小的包裹后还有一个限制就是让包裹数最多的那个包裹最少,就是说尽量都平均分,比如有6个,最少装成3个,平均就是全是2两个。


    思路:
          一开始没看到要求是平均分,按照出现次数sort一遍之后又用了一个map来插入序列,最后用一个O(n*log(n))的方法成功WA了一次,后来看到题目是平均分(哎!被白书上的题意坑好几回了),首先说明一点,就是最小的包数k就是最多出现的数字的次数,这个我想没必要在解释了吧,现在说一下平均分的问题,既然是平均分那么我们先把所有的数字从小到大拍一遍序,然后从第1个开始取,每次跳k步..然后从第2个开始每次跳k,最后每次拿出来的个数肯定是尽量平均的,还有很关键一点就是肯定不会拿出来相同的数字,因为每次+k,最多的数字出现的是k次,就算当前是最多的那个数字的第一个,那么+k只有也变成第k+1了,已经不是当前这个数字了,不明白的找个模拟很容易就懂了。




    #include<stdio.h>
    #include<algorithm>


    #define N 10000 + 10


    using namespace std;


    int num[N];


    int main ()
    {
       int i ,max ,n;
       while(~scanf("%d" ,&n) && n)
       {
          for(i = 1 ;i <= n ;i ++)
          scanf("%d" ,&num[i]);
          sort(num + 1 ,num + n + 1);
          int now = 1;
          for(max = 1 ,i = 2 ;i <= n ;i ++)
          {
             if(num[i] == num[i-1]) now ++;
             else now = 1;
             if(max < now) max = now;
          }
          
          printf("%d " ,max);
          for(i = 1 ;i <= max ;i ++)
          {
             for(int j = i ;j <= n ;j += max)
             if(j == i) printf("%d" ,num[j]);
             else printf(" %d" ,num[j]);
             puts("");
          }
       }
       return 0;
    }
          
          
          





  • 相关阅读:
    隐藏虚拟网卡
    Eclipse3.2编码选中对象着色
    PHP里的字符串定义小技巧汇总
    【原创】交互型网页防止IP欺骗的技巧
    VS2005的报错让我“二”了一把
    【原创】利用PHP5的__autoload代替繁琐低效的的外部文件包含方式
    关于WebDataWindow.Net的一些开发小细节
    PHP效率损失操作汇总
    动态添加按钮及关联方法(带参数)
    GridView中模版列使用RowCommand事件如何得到当前列的行索引或记录ID
  • 原文地址:https://www.cnblogs.com/csnd/p/12062578.html
Copyright © 2011-2022 走看看