zoukankan      html  css  js  c++  java
  • poj 1017 Packets

    题意:

    有一些货物需要装在包裹里,这些包裹是正方形的,并且高度相同,规模分别有1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6。

    现在给出每种包裹需要的数量,问最少需要多少个包裹可以装下这些货物。

    思路:

    需要最少的包裹,那肯定用最大的包裹装,即6 * 6。

    首先装6 * 6的,然后装5 * 5的,5 * 5的话剩下11个1 * 1;

    再装4 * 4,4 * 4的会剩下5个2 * 2;

    再考虑3 * 3,这个的情况就比较复杂,当3 * 3 的包裹数量除以4余数是1时,剩下3个3 * 3,可以放5个2 * 2,7个1 * 1;为2时,放3个2 * 2,6个1 * 1;为3时,放1个2 * 2,5个1 * 1;

    再考虑2 * 2和1 * 1,就比较好考虑了。

    以上结果都是画图可得并且贪心取得最大(3 * 3的画法不止一种,结果不同)。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int a[10];
     5 
     6 int main()
     7 {
     8     while (1)
     9     {
    10         int sum = 0;
    11         
    12         for (int i = 1;i <= 6;i++)
    13         {
    14             scanf("%d",&a[i]);
    15             
    16             sum += a[i];
    17         }
    18         
    19         if (sum == 0) break;
    20         
    21         int ans = 0;
    22         
    23         ans += a[6];
    24         
    25         ans += a[5];
    26         
    27         int res1 = 11 * a[5];
    28         
    29         ans += a[4];
    30         
    31         int res2 = 5 * a[4];
    32         
    33         ans += a[3] / 4;
    34         
    35         if (a[3] % 4)
    36         {
    37             ans++;
    38             
    39             if (a[3] % 4 == 1)
    40             {
    41                 res2 += 5;
    42                 res1 += 7;
    43             }
    44             
    45             if (a[3] % 4 == 2)
    46             {
    47                 res2 += 3;
    48                 res1 += 6;
    49             }
    50             
    51             if (a[3] % 4 == 3)
    52             {
    53                 res2 += 1;
    54                 res1 += 5;
    55             }
    56         }
    57         
    58         if (a[2] > res2)
    59         {
    60             a[2] -= res2;
    61             
    62             ans += a[2] / 9;
    63             
    64             if (a[2] % 9)
    65             {
    66                 ans++;
    67                 
    68                 res1 += 36 - (a[2] % 9 * 4);
    69             }
    70         }
    71         else
    72         {
    73             res2 -= a[2];
    74             
    75             res1 += res2 * 4;
    76         }
    77         
    78         a[1] -= res1;
    79         
    80         if (a[1] > 0)
    81         {
    82             ans += a[1] / 36;
    83             
    84             if (a[1] % 36) ans++;
    85         }
    86         
    87         printf("%d
    ",ans);
    88     }
    89     
    90     return 0;
    91 }
  • 相关阅读:
    loop messenger
    第四层交换
    波导耦合器设计 :CMI 受控模式相互作用
    转chinaunix wingger shell基础十二篇
    CVS 简单教程
    光纤的类型和应用(节选)
    java swing 中tree中数据排序
    谈谈NETBIOS与网上邻居的浏览
    vi大全
    asm基础拾遗
  • 原文地址:https://www.cnblogs.com/kickit/p/8808109.html
Copyright © 2011-2022 走看看