0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0
2 1
题目要求:每个包裹都是6*6的,而物件有1*1,2*2..........6*6。如何分配物件使所用的包裹数最小。
思路:先用一个数组保存各类物品的数量,然后进行从大到小判断。6*6:直接计数;5*5:直接计数,并且1*1的减11个;4*4:直接计数,其数目*5与2*2的数目比较,若大于则2*2清0,1*1的减去其差值乘4,否者2*2的减少4*4数目的五倍;3*3:数目除以4后计数,并将余数分为4种情况。没有余数跳过,有余数计数加一。若余数为3,则判断2*2的目是否大于0,大于则2*2减1,1*1的减5,若余数为2,则判断2*2的是否大于3,大于减3,1*1的减6,否者2*2清零并1*1减取3与2*2差值*4+6,若余数为一,则判断5和2*2的数目,若2*2多则其数目减5,1*1的减去6,否者2*2清零,1*1的减去5与2*2的差值*4+6;2*2:若不为0,则计数加上其数目/9,若模9有余数则再加一,1*1的数目减去36和其余数*4的差。1*1:若不小于1则计数加其数目/36,有余数计数再加一。
细节:题目思路没难度,只是复杂,要细心写判断语句。
#include <cstdio> #include<iostream> #include<stdio.h> #include<vector> #include<algorithm> #include<numeric> #include<math.h> #include<string.h> #include<map> #include<set> #include<vector> using namespace std; int main() { //freopen("r.txt", "r", stdin); int a[10]; int i,b,num,last; while(cin>>a[1]) { int count=0; for(i=2;i<=6;i++) cin>>a[i]; for(i=1;i<=6;i++) if(a[i]==0) count++; if(count==6) break; num=a[6]; if(a[5]>0) { num+=a[5]; if((a[5]*11)>=a[1]) { a[1]=0; } else { a[1]-=a[5]*11; } } if(a[4]>0) { num+=a[4]; if(a[4]*5>=a[2]) { last=36*a[4]-a[4]*16-a[2]*4; a[2]=0; if(a[1]>0) { if(last>=a[1]) { a[1]=0; } else { a[1]-=last; } } } else { a[2]-=a[4]*5; } } if(a[3]>0) { num+=a[3]/4; a[3]%=4; if(a[3]!=0) { num++; last=36-a[3]*9; if(a[3]==3) { if(a[2]!=0) { a[2]--; if(a[1]>5) { a[1]-=5; } else { a[1]=0; } } else { if(a[1]>9) { a[1]-=9; } else { a[1]=0; } } } if(a[3]==2) { if(a[2]>3) { a[2]-=3; if(a[1]>6) { a[1]-=6; } else { a[1]=0; } } else { last=18-a[2]*4; a[2]=0; if(a[1]>last) { a[1]-=last; } else { a[1]=0; } } } if(a[3]==1) { if(a[2]>5) { a[2]-=5; if(a[1]>7) { a[1]-=7; } else { a[1]=0; } } else { last=36-9-a[2]*4; a[2]=0; if(a[1]>last) { a[1]-=last; } else { a[1]=0; } } } } } if(a[2]>0) { num+=a[2]/9; a[2]%=9; if(a[2]!=0) { num++; last=36-a[2]*4; if(a[1]>last) { a[1]-=last; } else { a[1]=0; } } } if(a[1]>0) { num+=a[1]/36; a[1]%=36; if(a[1]!=0) { num++; } } cout<<num<<endl; } }