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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}