1 条题解
-
0
C :
#include<stdio.h> int main() { int b6,b5,b4,b3,b2,b1; //不同大小的木块个数 int nTotal = 0; //最少需要的箱子数目 int c1; //当前能放 1*1 木块的空格数目 int c2; //当前能放 2*2 木块的空格数目 int Contain2[4] = { 0, 5, 3, 1 }; //记录被3*3的占用之后,还剩多少给2*2的使用 while(1) { scanf("%d%d%d%d%d%d",&b1,&b2,&b3,&b4,&b5,&b6);//输入1*1到6*6箱子的个数 if (b1 == 0 && b2 == 0 && b3 == 0 && b4 == 0&& b5 == 0 && b6 == 0) break; nTotal = b6 + b5 + b4 + (b3 + 3)/4; //只能装1个6*6的,1个5*5的,1个4*4的,而3*3的需要多情况考虑,3*3的需要向上调整,你懂的。。。。。 //这里有一个小技巧 (b3+3)/4 正好等于b3除以4向上取整的结果,下同 c2 = 5 * b4 + Contain2[b3 % 4]; //放2*2的数目等于放一个4*4时需要5个2*2加上放1到4个3*3时各需要的数目 ,即还可以装多少个2*2的 if(b2 > c2) nTotal += (b2 - c2 + 8 ) / 9; //向上调整 ,总的2*2的个数减去装过的2*2的个数,得到剩余的2*2的个数,此个数加上8然后除以9就正好等于它除以9向上取整的结果,之所以总数要加上这个数是由于若单独装2*2,可以装9个 c1 = 36 * nTotal - 36 * b6 - 25 * b5 - 16 * b4 - 9 * b3 - 4 * b2; //还可以装多少个1*1的,妙啊! if(b1 > c1) nTotal += ( b1 - c1 + 35 ) / 36; //向上调整 ,总的1*1的个数减去装过的1*1的个数,得到剩余的1*1的个数,此个数加上35然后除以36就正好等于它除以36向上取整的结果,之所以总数要加上这个数是由于若单独装1*1,可以装36个 printf("%d\n",nTotal); } return 0; }
C++ :
/* 题目思路,对于6*6,5*5以及4*4尺寸的物品每个物品需要占有一个箱子, 对于3*3的物品一个箱子可以放4个, 2*2的物品箱子可以放9个, 1*1的可以放36个。 采用面积统计1*1箱子的空位,采用向上去整的方法统计箱子。 */ #include<iostream> #include<cstdio> #include<cstring> int num[4]={0,5,3,1};//一个6*6箱子可装:1个box[3]+5个box[2],2个box[3]+3个box[2],3个box[3]+1个box[2] int box[7]; int main(){ //freopen("input.txt","r",stdin); while(1){ int tmp=0; for(int i=1;i<=6;i++){ scanf("%d",&box[i]); // 读入每个物品的数目 tmp+=box[i]; } if(tmp==0) break; int ans=box[6]+box[5]+box[4]+(box[3]+3)/4; //a6,a5,a4,每个物品占有一个箱子(a3 + 3 ) / 4 代表a3的物品需要占 int a2=box[4]*5+num[box[3]%4]; //统计所有的大物品放进箱子中后a2物品的空位子有多少 //box[4]*5表示一个6*6箱子可装:1个box[4]+5个box[2] if(box[2]>a2) ans+=(box[2]-a2+8)/9;//一个箱子可以放:1个box[4]+5个box[2],一个box[3]+5个box[2],求装满box[3]和box[4]后,剩余箱子box[2]可以装几个箱子 int a1=ans*36-box[6]*36-box[5]*25-box[4]*16-box[3]*9-box[2]*4; if(box[1]>a1) //求a1的空位子,只需要统计剩余的面积即可 ans+=(box[1]-a1+35)/36; printf("%d\n",ans); } return 0; }
- 1
信息
- ID
- 702
- 时间
- 1000ms
- 内存
- 10MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者