• 贪心 模拟


    贪心 
    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

    Description

    杂货店出售一种由N3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装。你现在需要使用这N种颜料;不但如此,你还需要一定数量的灰色颜料。杂货店从来不出售灰色颜料——也就是它不属于这N种之一。幸运的是,灰色颜料是比较好配置的,如果你取出三种不同颜色的颜料各ml,混合起来就可以得到x ml的灰色颜料(注意不是3x)。

    现在,你知道每种颜料各需要多少ml。你决定买尽可能少的“颜料套装”,来满足你需要的这N+1种颜料。那么你最少需要买多少个套装呢?

    Input

    输入包含若干组测试数据。每组数据一行:第一个数N, 3<=N<=12, 含义如上;接下来N+1个数,分别表示你需要的N+1种颜料的毫升数。最后一种是灰色。所有输入的毫升数<=1000.

    注意:输入中不存在每个颜料套装的毫升数。由题意可知,每种各50ml,即一共50N ml

    Output

    每组数据输出一行,最少需要的套装数。

    Sample Input

    
    

    3 40 95 21 0

    7 25 60 400 250 0 60 0 500

    4 90 95 75 95 10

    5 0 0 0 0 0 333

    0

    
    

    Sample Output

    
    

    2

    8

    2

    4

      用贪心,先找到需要的最多的那种颜料量max(灰色除外),算出不算灰色时所需要count套颜料。然后用count*50减去每种需要的颜料,就是除了各自所需要的外,还剩多少可以去配灰色。用qsort按从大到小排序。一个循环,看第三种颜料是不是等于0,而且灰色颜料是不是不等于0.如果是的话,说明不够配灰色了,每种要加50mlcount++。然后灰色颜料数减一,如果等于0了,说明灰色配够了,退出。否则前三种颜料数减一,再把所有从小到大排序。再循环回去。我本来不是一个一个减的,就像 0 0 0 0 0 333 这个是50 50 50 50 50 把前三种都减50,变成0 0 0 50 50,这样比较快,但显然不是最优的,可是又想不到其他方法,后来看到网上一篇解题报告正好讲到这个问题。然后才解决了。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <string>
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     int n,col[13],gray;
    10     while(cin>>n && n)
    11     {
    12         int ma = 0; 
    13         for(int i = 0;  i < n; i++)
    14         {
    15             cin>>col[i];
    16             if(col[i] > ma) ma = col[i];
    17 
    18         }
    19         cin>>gray;
    20         int ans = 0;
    21         if(ma%50==0)
    22             ans = ma / 50;
    23         else
    24             ans = ma / 50 + 1;
    25 
    26         for(int i = 0;  i < n; i++)
    27         {
    28             col[i] = 50 * ans - col[i];
    29         }
    30         sort(col,col+n,greater<int>());
    31         for(;;)
    32         {
    33             if(col[2] == 0 && gray > 0)
    34             {
    35                 ans++;
    36                 for(int i = 0;  i < n; i++)
    37                 {
    38                     col[i] = 50 + col[i];
    39                 }
    40 
    41 
    42             }
    43             if(gray <= 0) break;
    44             else
    45             {
    46                 gray--;
    47                 for(int i=0; i<3; i++)
    48                     col[i]--;
    49                 sort(col,col+n,greater<int>());
    50 
    51             }
    52         }
    53         cout<<ans<<endl;
    54 
    55 
    56     }
    57 
    58 
    59     return 0;
    60 }
  • 相关阅读:
    Word转pdf
    jquery 中json数组的操作 增删改
    Js、Jquery定时执行(一次或者重复多次,取消重复)
    sql server 2008 (不允许保存更改,您所做的更改要求删除并重新创建以下表) 的解决办法
    C#中 ArrayList 的使用
    Jquery正则表达式公式
    C#判断字符串是否存在字母及字符串中字符的替换实例
    纳闷的EF异常:在提供程序连接上启动事务时出错
    C# WinForm获取当前路径汇总
    Entity Framwork 6 编译出错的问题(VS2012)
  • 原文地址:https://www.cnblogs.com/cjshuang/p/4646639.html
Copyright © 2020-2023  润新知