一家工厂生产的产品规格分为1×1, 2×2, 3×3, 4×4, 5×5, 6×6,高都是h。工厂要把它们包在6×6×h的包装袋中。工厂想让包装数尽可能少。
多组数据。每一行为一组数据。依次是1×1, 2×2, 3×3, 4×4, 5×5, 6×6的产品的个数。 输入数据由6个0结束。
对于每组数据,输出包装所有产品所需最少包装袋数量
0 0 4 0 0 1 7 5 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
2 1 2
这题写的超级难受,开始没有具体去分析题目,写了个很多循环的版本,错了
调了好久的问题,感觉使用循环比较复杂
错误的版本:
#include<iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll s[10];
while(cin>>s[1]>>s[2]>>s[3]>>s[4]>>s[5]>>s[6]){
if(!s[1]&&!s[2]&&!s[3]&&!s[4]&&!s[5]&&!s[6])break;
ll ans=0;
for(ll i=6;i>=1;i--){
while(s[i]){
s[i]--;
ll sum=i*i;
for(ll j=min(6-i,i);j>=1;j--){
while(sum+j*j<=36&&s[j]>0){
s[j]--;
sum+=j*j;
//我忽略了边长为3的情况,当有一个,边长为2的只能填充5个
// 两个, 3
// 三个 1
}
}
ans++;
}
}
// cout<<s[1]<<" "<<s[2]<<" "<<s[3]<<" "<<s[4]<<" "<<s[5]<<" "<<s[6]<<endl;
cout<<ans<<endl;
}
return 0;
}
所以我们需要特殊判断为3的情况
#include<iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
int s1,s2,s3,s4,s5,s6;
while(cin>>s1>>s2>>s3>>s4>>s5>>s6&&s1+s2+s3+s4+s5+s6){
int ans=0;
ans+=s6;
ans+=s5;
s1=max(0,s1-11*s5);
ans+=s4;
if(s2<5*s4)s1=max(0,s1-(5*s4-s2));
s2=max(0,s2-5*s4);
ans+=(s3+3)/4;
s3%=4;
if(s3==1){
if(s2<5) s1 = max(0, s1-(27-4*s2));
else s1 = max(0, s1-7);
s2 = max(0, s2-5);
}
else if(s3==2){
if(s2<3) s1 = max(0, s1-(18-4*s2));
else s1 = max(0, s1-6);
s2 = max(0, s2-3);
}
else if(s3==3){
if(s2<1) s1 = max(0, s1-(9-4*s2));
else s1 = max(0, s1-5);
s2 = max(0, s2-1);
}
ans+=(s2+8)/9;
s2%=9;
if(s2)s1=max(0,s1-(36-4*s2));
ans+=(s1+35)/36;
cout<<ans<<endl;
}
return 0;
}
这样应该是对的