poj1017
一、题意:有底面积为1*1,2*2,...,6*6高为h的物品若干,求用最少的包装盒包装好这些物品,其中包装盒的大小固定为底面积6*6,高为h
二、思路:贪心。先放大的,然后用小的尽量去凑满这个包装盒,从6到1类推。我用的是比较暴力的方法,每一种情况都考虑出来,然后模拟。
三、代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include"iostream" #include"stdio.h" #include"math.h" using namespace std; int num[7]; int Solve() { int res=num[5]; res+=num[4]; num[0]-=num[4]*11; res+=num[3]; if (num[1]<num[3]*5) { num[0]-=(20*num[3]-4*num[1]); } num[1]-=num[3]*5; res+=num[2]/4; int numLeave=num[2]%4; if (numLeave>0) res++; switch (numLeave) { case 1: if (num[1]<5) { if (num[1]>0) { num[0]-=(27-num[1]*4); num[1]=0; } else num[0]-=27; } else { num[1]-=5; num[0]-=7; } break ; case 2: if (num[1]<3) { if (num[1]>0) { num[1]=0; num[0]-=(18-num[1]*4); } else num[0]-=18; } else { num[1]-=3; num[0]-=6; } break ; case 3: if (num[1]<1) { num[0]-=9; } else { num[1]-=1; num[0]-=5; } break ; default : break ; } if (num[1]>0) { res+=num[1]/9; if (num[1]%9>0) { res++; num[0]-=(36-4*(num[1]%9)); } } if (num[0]>0) { res+= ceil (num[0]/36.0); } return res; } int main() { while ( true ) { int sum=0; for ( int i=0;i<6;i++) { cin>>num[i]; sum+=num[i]; } if (!sum) break ; cout<<Solve()<<endl; } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步