Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36708 | Accepted: 12227 |
Description
Input
Output
Sample Input
0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0
Sample Output
2 1
本题说是用贪心,说实在的没感觉到贪心的存在,理解了,顺理成章就写下来啦;
题意:
公司有几种盒子 如6*6 6*5 3*3 ....当然,只有一层,我们在这里面放物品,物品的规格也是 6* 6 5*5 .....等,问我们最少需要多少个盒子
输入:
每行六个数据,分表代表 1*1 2*2 3*3 4*4 ...等等的数量
当全为0时结束程序
解题思路:
先看6*6 这种的是一对一
5*5 每个可以剩余1*1的有11个空位
4*4 里面可以添加2*2 或1*1的
3*3 里面可以添加2*2 或1 *1
2*2 和 1*1 在上面添加 剩余的话 再自身添加盒子就行啦
我的基本思路是,从上向下,每次有剩余的时候,先添加2*2 ,有剩余再添加1*1
注意事项:
当每次超出一个6*6的规格时,记住要加1,不然少个盒子
当每次2*2的剩余盒子没用完时,要先加到1*1上后再 让res2归0,(这个让我错了两次)
2*2 规格 换算为1*1时 记住是*4.哎,人一急救搞错,如果你的测试不通过,可以检查下
测试数据:
58 63 33 3 3 3
结果 24
我的代码,有点长,还算好理解吧,里面的res1 res2分别代表本次剩余的可以添加2*2 或1*1的格子数量
#include<stdio.h> int main() { int a1,a2,a3,a4,a5,a6; int res,res1,res2,sum; while(scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6)) { if(a1+a2+a3+a4+a5+a6==0) break; sum=0; if(a6>0) sum+=a6; if(a5>0) { sum+=a5; res=a5*11; if(res>a1) a1=0; else a1-=res; } if(a4>0) { sum+=a4; res2=5*a4; res1=0;//////// if(a2<res2) { res1=(res2-a2)*4; a2=0; } else { a2-=res2; res1=0; } if(res1>0&&a1>0) { if(a1<res1) a1=0; else a1-=res1; } } if(a3>0) { if(a3>=4) { sum+=a3/4; if(a3%4!=0) sum++; } else sum++; res1=res2=0;///////////*** if(a3%4!=0) { res=a3%4; res2=5-(res-1)*2; res1=8-res; if(a2>0) { if(a2<res2) { res1+=(res2-a2)*4;////// a2=0; } else { a2-=res2; } } if(a1>0) { if(a1<res1) { a1=0; } else { a1-=res1; } } } } if(a2>0) { if(a2>=9) { sum+=a2/9; if(a2%9!=0) sum++; } else sum++; res=a2%9; if(res>0) { res1=(9-res)*4; if(a1>0) { if(a1<res1) a1=0; else a1-=res1; } } } if(a1>0) { if(a1>=36) { sum+=a1/36; if(a1%36!=0) sum++; } else sum++; } printf("%d\n",sum); } return 0; }
下面是一个超短代码,其实也很好理解,可以当做刷排名用吧,呵呵
#include<stdio.h> int main(){ int n,a,b,c,d,e,f,x,y; int u[4]={0,5,3,1}; while(1){ scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break; n=d+e+f+(c+3)/4; y=5*d+u[c%4]; if(b>y) n+=(b-y+8)/9; x=36*n-36*f-25*e-16*d-9*c-4*b; if(a>x) n+=(a-x+35)/36; printf("%d\n",n); } return 0; }