Problem R

简单题意
包装盒为6*6的方盒,礼品为方形边长依次为1,2,3,4,5,6,用最少的包装盒,装下给出的礼品
解题思路形成过程
我是想从大的礼品开始包装,通过6个while循环包装从大到小的礼品,对于长为6礼品一个盒子只能装下他一个,对于边长为5的礼品一个盒子装下他之后还可以装下11个边长为1的,对于边长为4的,装完一个后可以最多装5个边长为2的,如果不够则将剩下的空间转化成装长为1的空间,对于边长为3的,装完一个后可以装下3个边长为3的,如果不够,要分别考虑剩下的空间能装几个边长为1和2的,2不够再转为1,对于边长为2的一个包装盒可以最多盛下9个,不够的话剩下的空间转为1,最后对于边长为1的,一个盒子最多可以装满36个,因此这种方法通过前面的循环可以大幅削减边长为1和2的数量,尤其是长为1的。
感想
这种方法需要有明确的思路,也是上c++实验课完成的题目,写的代码太长了点,本还以为会超时还特意改了cin为scanf,最后提交上去竟然AC了,上课编的两道题都AC了,感觉有点不可思议大笑
AC代码
#include <iostream>
#include <stdio.h>
#include <fstream>
using namespace std;
int main(){
 ifstream cin("in.txt");
 int a1,a2,a3,a4,a5,a6;
 while( scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6)&&(a1||a2||a3||a4||a5||a6)){
  int cnt=0;
  while(a6>0){
   cnt++;
   a6--;
  }
  while(a5>0){
   cnt++;
   a5--;
   if(a1>0){
    if(a1>=11){
     a1-=11;
    }else{
     a1=0;
    }
   }
  }
  while(a4>0){
   cnt++;
   a4--;
   int left;
   if(a2>0){
    if(a2>=5){
     a2-=5;
     continue;
    }else{
     left=20-4*a2;
     a2=0;
    }
   }
   if(a1>0){
    if(a1>left)a1-=left;
    else a1=0;
   } 
  }
  while(a3>0){
   cnt++;
   a3--;
   int left1;
   int left2;
   if(a3>=3){
   a3-=3;
   continue;
   }else{
    switch(a3){
     case 0:left2=5;left1=7;break;
      case 1:left2=3;left1=6;break;
       default :left2=1;left1=5;break;
    }
    a3=0;
   }
   if(a2>0){
    if(a2>left2){
     a2-=left2;
    }else{
     left1=left1+(left2-a2)*4;
     a2=0;
    }
   }
   if(a1>0){
    if(a1>left1){
     a1-=left1;
    }else{
     a1=0;
    }
   } 
  }
  while(a2>0){
   cnt++;a2--;
   int left1;
   if(a2>=8){
    a2-=8;
    continue;
   }else{
    left1=(8-a2)*4;
    a2=0;
   }
   if(a1>0){
    if(a1>left1)a1-=left1;
    else a1=0;
   }
  }
  while(a1>0){
   cnt++;
   if(a1>36)a1-=36;
   else a1=0;
  }
  cout<<cnt<<endl;
 }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值