zoukankan      html  css  js  c++  java
  • 出口胡萝卜 (贪心加暴力算法)

    题目描述

    终于,Nova君饲养的小兔子们成精了,他们可以帮着赚钱啦。春天,兔子们播下胡萝卜的种子;夏天,兔子们耕耘;秋天,兔子们收获硕大无比的胡萝卜;冬天,兔子们把胡萝卜包装好,远销海内外。现在问题来了,Nova君希望削减包装的运输的成本,因而要尽可能少的用包装箱。兔子们种植的胡萝卜很奇葩,他们的长度都为H,但粗细度不一致,为了方便,事先把胡萝卜风干并且切成规则的长方体,规格为AAH,H为长度,A为横切面的边长。假设胡萝卜只有1x1xH,2x2xH,3x3xH, 4x4xH, 5x5xH, 6x6xH这6种规格,通常使用一个 6x6xH的长方体包裹包装然后邮寄给客户。

    输入

    多组测试数组(组数少于100),对于每组数据,输入一行,为6个正整数(int范围内),分别代表规格为 1x1xH 至6x6xH 这六种胡萝卜的数量。

    输出

    对于每组数据,输出一行,为所需最少的包裹数。

    输入样例

    0 0 4 0 0 1   
    7 5 1 0 0 0   

    输出样例

    2
    1
    题目来源:http://biancheng.love/contest/23/problem/C/index
    解题思路:同样采用贪心算法,不过这次的贪心算法很麻烦,但是思路很清晰。(好比做高中数学题)
    首先讨论一下我们应该先发哪一种萝卜。
    电脑没电了,先给出代码。白天补上详解。
    详解来的有点晚了。(像素不高,但是过程还是表示滴挺清楚的)

    代码:
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 int a[7];
     5 
     6 int main()
     7 {
     8     long long ans;
     9     while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]))
    10     {
    11         ans=a[6];
    12         if(a[5]>0)
    13         {
    14             ans=ans+a[5];
    15             a[1]=a[1]-11*a[5];
    16         }
    17         if(a[4]>0)
    18         {
    19             ans=ans+a[4];
    20             if(a[2]>=5*a[4])
    21                 a[2]=a[2]-5*a[4];
    22             else
    23             {
    24                 a[1]=a[1]-(20*a[4]-4*a[2]);
    25                 a[2]=0;
    26             }
    27         }
    28         if(a[3]>0)
    29         {
    30             if(a[3]%4==0)
    31                 ans=ans+a[3]/4;
    32             else
    33             {
    34                 ans=ans+a[3]/4+1;
    35                 if(a[3]%4==1)
    36                 {
    37                     if(a[2]>=5)
    38                     {
    39                         a[2]=a[2]-5;
    40                         a[1]=a[1]-7;
    41                     }
    42                     else
    43                     {
    44                         a[1]=a[1]-(27-4*a[2]);
    45                         a[2]=0;
    46                     }
    47                 }
    48                 if(a[3]%4==2)
    49                 {
    50                     if(a[2]>=3)
    51                     {
    52                         a[2]=a[2]-3;
    53                         a[1]=a[1]-6;
    54                     }
    55                     else
    56                     {
    57                         a[1]=a[1]-(18-4*a[2]);
    58                         a[2]=0;
    59                     }
    60                 }
    61                 if(a[3]%4==3)
    62                 {
    63                     if(a[2]>=1)
    64                     {
    65                         a[2]=a[2]-1;
    66                         a[1]=a[1]-5;
    67                     }
    68                     else
    69                     {
    70                         a[1]=a[1]-9;
    71                     }
    72                 }
    73             }
    74         }
    75         if(a[1]<0) a[1]=0;
    76         if((a[2]*4+a[1])%36==0)
    77             ans=ans+(a[2]*4+a[1])/36;
    78         else
    79             ans=ans+(a[2]*4+a[1])/36+1;
    80         printf("%lld
    ",ans);
    81     }
    82 }
    简化代码:(思路相同)
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int a,b,c,d,e,f,x,y;
     7     int sum;
     8     int u[4]= {0, 5, 3, 1}; //对应的是当c%4 = 0, 1, 2, 3 时,剩余空间可放2*2大小的个数
     9 
    10     while(~scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f))
    11     {
    12         sum = 0;
    13         if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
    14             break;
    15         sum = f; //每个包裹只能转一个6*6的
    16         sum += e;//每个包裹只能装一个5*5的
    17         sum += d;//每个包裹只能装一个4*4的
    18         sum += (c+3)/4;//每个包裹可以装4个 3*3的
    19         y = 5*d + u[c%4];
    20         if(b>y)
    21             sum += (b-y+8)/9;
    22         x = sum *36 - f*36 -e*25 - d*16 - c*9 - b*4;
    23         if(a>x)
    24             sum += (a-x+35)/36;
    25 
    26         printf("%d
    ",sum);
    27     }
    28 }
    
    
    
    
  • 相关阅读:
    C++中的string和stringstream用法1
    回调函数简析
    Qt界面设计更新
    C/C++中的类型转换
    桥接模式 bridge pattern
    装饰者模式
    适配器模式
    代理模型
    工厂类---抽象工厂(3)
    [效率神技]Intellij 的快捷键和效率技巧|系列一|常用快捷键
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5002071.html
Copyright © 2011-2022 走看看