#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 7
using namespace std;
int n;
int a[N];
int temp[5]= {0,1,3,5,9};
int l[3];
int main()
{
// int t;
// scanf("%d",&t);
freopen("ex.in","r",stdin);
while(1)
{
int cnt=0,ok=0;
for(int i=1; i<7; i++)
{
scanf("%d",&a[i]);
if(a[i]&&!ok)
ok=1;
}
if(!ok)
break;
memset(l,0,sizeof(l));
cnt+=a[6]+a[5]+a[4];
l[1]=a[5]*11;
l[2]=a[4]*5;
cnt+=a[3]/4;
a[3]%=4;
if(a[3])
{
cnt++;
l[2]+=temp[4-a[3]];//
l[1]+=36-temp[4-a[3]]*4-a[3]*9;//
}
a[2]-=l[2];
if(a[2]<0)
{
l[1]+=-a[2]*4;
}
if(a[2]>0)
{
cnt+=a[2]/9;
a[2]%=9;
if(a[2])
{
cnt++;
l[1]+=36-a[2]*4;
}
}
a[1]-=l[1];
if(a[1]>0)
{
cnt+=a[1]/36;
a[1]%=36;
if(a[1])
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
简单的贪心,按照从大到小放的原则~ 4*4,5*5,6*6的,一个盒子只能放一个,所以有多少个4*4,5*5,6*6就最少有这么多盒子,然后看3*3的,4个3*3的能放进一个盒子,用3*3出现的次数加上3除以4得到放3*3需要多少个盒子,这时候只剩下2*2, 1*1了,2*2能放到1个4*4里面5个,能放到一个3*3里面有4种情况:0,1,3,5.最后放1*1的,哪放得下放哪,实在放不下了就再增加盒子~ 比下边的方法好!!!!!!!!
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 7
using namespace std;
int n;
int a[N];
int temp[5]= {0,1,3,5,9};
int main()
{
// int t;
// scanf("%d",&t);
// freopen("ex.in","r",stdin);
while(1)
{
int cnt=0,ok=0;
for(int i=1; i<7; i++)
{
scanf("%d",&a[i]);
if(a[i]&&!ok)
ok=1;
}
if(!ok)
break;
cnt+=a[6]+a[5]+a[4];
a[1]-=a[5]*11;
a[2]-=a[4]*5;
if(a[2]<0)
{
a[1]+=a[2]*4;
a[2]=0;
}
// if(a[1]<0)
// a[1]=0;
cnt+=a[3]/4;
a[3]%=4;
if(a[3])
{
cnt++;
int t=4-a[3];
a[2]-=temp[t];//
int num=0;
if(a[2]<0)
{
num=-a[2];
a[2]=0;
}
a[1]-=36-a[3]*9-temp[t]*4+num*4;
// if(a[1]<0)
// a[1]=0;
}
if(a[2]>0)
{
cnt+=a[2]/9;
a[2]%=9;
if(a[2])
{
cnt++;
a[1]-=36-a[2]*4;
}
}
if(a[1]>0)
{
cnt+=a[1]/36;
a[1]%=36;
if(a[1])
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
311 Packets
最新推荐文章于 2023-08-31 19:11:51 发布