PTA装箱问题

一、题目描述

 

 

 二、解题思路

  这道题是一个贪心的问题。不能想当然的直接按照面积直接装,因为箱子是一个整个的,不可以分开。

  

  首先是6*6的箱子,你可以直接装

  然后是5*5的箱子,你在装完一个5*5之后,最多只能再装11个1*1,是1*1尽量往这里面装。一直到5*5的箱子装完

  然后是4*4的箱子,装完一个4*4之后,我最多还能装5个2*2的箱子,如果没有5个2*2的箱子,那么就尽量把1*1的箱子往这里面放

  然后是3*3的箱子,这个箱子的情况有点多

    首先我们能用3*3尽量的装满一个箱子,即a[3] / 4加入答案,然后让a[3]%4,就是剩下的3*3的箱子了

    第一种情况:如果还剩1个3*3的箱子,那么我最多可以装5个2*2的箱子,剩下的没装满的尽量用1*1的装满

    第二种情况:如果还剩2个3*3的箱子,那么我最多可以装3个2*2的箱子,剩下的没装满的尽量用1*1的装满、

    第三种情况:如果还剩3个3*3的箱子,那么我最多可以装1个2*2的箱子,剩下的没装满的尽量用1*1的装满

  然后是1*1的情况,直接+a[1] / 36,a[1] % 36,如果a[1]还有的话,就要花费一个箱子去装他。

三、代码实现

  1 #include "bits/stdc++.h"
  2 #define PII pair<int,int>
  3 #define rep(i,z,n) for(int i = z;i <= n; i++)
  4 #define per(i,n,z) for(int i = n;i >= z; i--)
  5 #define ll long long
  6 #define db double
  7 #define vi vector<int>
  8 #define debug(x) cerr << "!!!" << x << endl;
  9 using namespace std;
 10 //从某个串中把某个子串替换成另一个子串
 11 string& replace_all(string& src, const string& old_value, const string& new_value) {
 12     // 每次重新定位起始位置,防止上轮替换后的字符串形成新的old_value
 13     for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) {
 14         if ((pos = src.find(old_value, pos)) != string::npos) {
 15             src.replace(pos, old_value.length(), new_value);
 16         }
 17         else break;
 18     }
 19     return src;
 20 }
 21 inline ll read()
 22 {
 23     ll s,r;
 24     r = 1;
 25     s = 0;
 26     char ch = getchar();
 27     while(ch < '0' || ch > '9'){
 28         if(ch == '-')
 29             r = -1;
 30         ch = getchar();
 31     }
 32     while(ch >= '0' && ch <= '9'){
 33         s = (s << 1) + (s << 3) + (ch ^ 48);
 34         ch = getchar();
 35     }
 36     return s * r;
 37 }
 38 inline void write(ll x)
 39 {
 40     if(x < 0) putchar('-'),x = -x;
 41     if(x > 9) write(x / 10);
 42     putchar(x % 10 + '0');
 43 }
 44 int a[7];
 45 int main()
 46 {
 47     while(cin >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6]){
 48         if(!a[1] && !a[2] && !a[3] && !a[4] && !a[5] && !a[6])
 49             break;
 50         int ans = 0;
 51         ans += a[6];
 52         //处理5的情况
 53         while(a[5] > 0){
 54             ans++;
 55             int sum = 0;
 56             while(a[1] > 0 && sum < 11){
 57                 sum++;
 58                 a[1]--;
 59             }
 60             a[5]--;
 61         }
 62 
 63         //处理4的情况
 64         while(a[4] > 0){
 65             ans++;
 66             int sum = 0;
 67             while(a[2] > 0 && sum < 5){
 68                 a[2]--;
 69                 sum++;
 70             }
 71             sum = 20 - sum * 4;
 72             int sum1 = 0;
 73             while(a[1] > 0 && sum1 < sum){
 74                 a[1]--;
 75                 sum1++;
 76             }
 77             a[4]--;
 78         }
 79 
 80         //处理3的情况
 81         ans += a[3] / 4;
 82         a[3] = a[3] % 4;
 83         if(a[3] == 1){
 84             int sum = 0;
 85             while(a[2] > 0 && sum < 5){
 86                 a[2]--;
 87                 sum++;
 88             }
 89             ans++;
 90             sum = 27 - sum * 4;
 91             int sum1 = 0;
 92             while(a[1] > 0 && sum1 < sum){
 93                 a[1]--;
 94                 sum1++;
 95             }
 96             a[3] = 0;
 97         }
 98         if(a[3] == 2){
 99             int sum = 0;
100             while(a[2] > 0 && sum < 3){
101                 a[2]--;
102                 sum++;
103             }
104             ans++;
105             sum = 18 - sum * 4;
106             int sum1 = 0;
107             while(a[1] > 0 && sum1 < sum){
108                 a[1]--;
109                 sum1++;
110             }
111             a[3] = 0;
112         }
113         if(a[3] == 3){
114             int sum = 0;
115             while(a[2] > 0 && sum < 1){
116                 a[2]--;
117                 sum++;
118             }
119             ans++;
120             sum = 9 - sum * 4;
121             int sum1 = 0;
122             while(a[1] > 0 && sum1 < sum){
123                 a[1]--;
124                 sum1++;
125             }
126             a[3] = 0;
127         }
128 
129         ans += a[2] / 9;
130         a[2] = a[2] % 9;
131         if(a[2]){
132             ans++;
133             int sum = 36;
134             sum -= a[2] * 4;
135             while(sum > 0 && a[1] > 0){
136                 a[1]--;
137                 sum--;
138             }
139         }
140 
141         ans += a[1] / 36;
142         a[1] = a[1] % 36;
143         if(a[1])
144             ans++;
145         cout << ans << endl;
146     }
147     return 0;
148 }
posted @ 2022-03-23 21:46  scannerkk  阅读(262)  评论(0)    收藏  举报