题目大意:
有1*1,2*2,3*3,...六种小包裹,往6*6的箱子里装,给出六种小包裹各自的数量,求出最少用的箱子的个数。
贪心,思路还是比较简单的,先从大的开始往小的装。
6*6的包裹,每个单独装一个箱子;
5*5的包裹,可以和11个1*1的搭配;
4*4的包裹,可以喝5个2*2的搭配,如果2*2的不够,则补1*1的个数;
.
.
.
以此类推(注意3*3的有四种搭配方案)。
这里可以每次优先用2*2的去填,如果2*2的为负了,再用1*1的补正,这样可以简化过程。
最后如果1*1的数量为负,则不用处理(原因很简单,在此不赘余),若为正,则继续装。
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <map> #include <queue> typedef long long ll; #define inf 0x3f3f3f3f using namespace std; int a,b,c,d,e,f; ll sum; int main() { while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF) { sum=0; if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break; sum=sum+f+e; a=a-11*e; sum=sum+d; if(b-5*d>=0) b=b-5*d; else { a=a-4*(5*d-b); b=0; } if(c%4==0) sum=sum+c/4; else if(c!=0) { sum=sum+c/4+1; int te=c%4; if(te==1) { if(b>=5) { b-=5; a-=7; } else if(b==4) { b-=4; a-=11; } else if(b==3) { b-=3; a-=15; } else if(b==2) { b-=2; a-=19; } else if(b==1) { b-=1; a-=23; } else { a-=27; } } else if(te==2) { if(b>=3) { b-=3; a-=6; } else if(b==2) { b-=2; a-=10; } else if(b==1) { b-=1; a-=14; } else { a-=18; } } else if(te==3) { if(b>=1) { b-=1; a-=5; } else { a-=9; } } } if(b>0) { while(b>=9) { sum+=1; b-=9; } if(b>0) sum+=1; a=a-(9-(b%9))*4; if(a>=0&&a%36==0) sum+=a/36; else if(a>0) sum+=a/36+1; } else { if(a>=0&&a%36==0) sum+=a/36; else if(a>0) sum+=a/36+1; } printf("%lld\n",sum); } return 0; }
原文:http://www.cnblogs.com/zhangmingcheng/p/4271338.html