题意:小P开了一家淘宝店铺,店铺里所有的商品高度都为h,但长和宽分别为1*1,2*2,3*3,4*4,5*5,6*6六种规格。这一天来了一个大客户,他订购了很多物品。所以小P需要将东西都邮寄给他,但是小P只有高度为h,长宽为6*6的箱子,小P想知道自己最少需要用多少个箱子,才能把客户需要的所有物品都寄过去?(多组输入,遇到0 0 0 0 0 0结束)
题解:贪心的大水题,只要把握好从大到小放入箱子的同时,尽可能将箱子放满即可。
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; const int inf = 0x3f3f3f3f; typedef long long ll; int n[10]; int main(void) { ios::sync_with_stdio(false); while (cin >> n[1] >> n[2] >> n[3] >> n[4] >> n[5] >> n[6]) { int flag = 0; for (int i = 1; i <= 6; i++) { if (n[i] != 0) flag = 1; } if (flag == 0)break; int ans = 0; ans += n[6]; if (n[5] > 0) { ans += n[5]; n[1] -= n[5] * 11; if (n[1] < 0)n[1] = 0; } if (n[4] > 0) { ans += n[4]; if (n[2] >= n[4] * 5) n[2] -= n[4] * 5; else { int n1 = 20 * n[4] - n[2] * 4; n[2] = 0; n[1] -= n1; if (n[1] < 0)n[1] = 0; } } if (n[3] > 0) { if (n[3] % 4 == 0) ans += (n[3] / 4); else { ans += (n[3] / 4) + 1; n[3] = n[3] % 4; if (n[3] == 1) { if (n[2] >= 5) { n[2] -= 5; n[1] -= 7; if (n[1] < 0)n[1] = 0; } else { n[1] -= (27 - n[2] * 4); n[2] = 0; if (n[1] < 0)n[1] = 0; } } if (n[3] == 2) { if (n[2] >= 3) { n[2] -= 3; n[1] -= 4; if (n[1] < 0)n[1] = 0; } else { n[1] -= (18 - n[2] * 4); n[2] = 0; if (n[1] < 0)n[1] = 0; } } if (n[3] == 3) { if (n[2] >= 1) { n[2]--; n[1] -= 5; if (n[1] < 0)n[1] = 0; } else { n[1] -= (9 - n[2] * 4); n[2] = 0; if (n[1] < 0)n[1] = 0; } } } } if (n[2] > 0) { if(n[2]%9==0) ans += n[2] / 9; else { ans += n[2] / 9 + 1; n[2] = n[2] % 9; n[1] -= (36 - n[2] * 4); n[2] = 0; if (n[1] < 0)n[1] = 0; } } if (n[1] > 0) { if(n[1]%36==0) ans += n[1] / 36; else ans += n[1] / 36 + 1; } cout << ans << endl; } return 0; }