一道贪心题,思路好想,不过细节有点多
自行百度题解
附上一个dalao代码
#include<stdio.h>
int main()
{
int n,a,b,c,d,e,f,x,y;
int u[4]={0,5,3,1};
while(1)
{
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
break;
n=d+e+f+(c+3)/4;//懂了
y=5*d+u[c%4];//在已有n个的情况下,能装下y个2*2的
if(b>y)
n+=(b-y+8)/9;//把多的2*2的弄进来
x=36*n-36*f-25*e-16*d-9*c-4*b;
if(a>x)
n+=(a-x+35)/36;//把1*1的弄进来
printf("%d\n",n);
}
return 0;
}
在附上我的辣鸡代码以作比较,有很多没有的代码,但是这些没用的代码让思路更清晰
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
#include<ctime>
#include<cstring>
#include<stdlib.h>
#include<map>
using namespace std;
int size[7],num,scrap[7],cost,go,i;
void cut(int x)
{
if(x == 2)
{
if(size[2] > scrap[2])
{
size[2] -= scrap[2];
scrap[2] = 0;
}
else
{
scrap[2] -= size[2];
size[2] = 0;
scrap[1] += scrap[2]*4;
scrap[2] = 0;
cut(1);
}
return ; //1. 防止运行上面代码后,x恰好变为1
}
if(x == 1)
{
if(size[1] > scrap[1])
{
size[1] -= scrap[1];
scrap[1] = 0;
}
else
{
scrap[1] -= size[1];
size[1] = 0;
}
}
}
int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
while(1)
{
num = 0;
go = 0;
memset(scrap,0,sizeof(scrap));
for(i = 1;i <= 6;i ++)
{
scanf("%d",&size[i]);
if(size[i] != 0) go = 1;
}
if(!go) break;
num += size[6];
size[6] = 0;
num += size[5];
scrap[1] += size[5]*11;
cut(1);
size[5] = 0;
num += size[4];
scrap[2] += size[4]*5;
cut(2);
size[4] = 0;
num += size[3]/4;
size[3] %= 4;
if(size[3]) num ++;
if(size[3] == 1)
{
scrap[2] = 5;
scrap[1] = 7;
cut(2);
}
if(size[3] == 2)
{
scrap[2] = 3;
scrap[1] = 6;
cut(2);
}
if(size[3] == 3)
{
scrap[2] = 1;
scrap[1] = 5; //4. 数错数了.....数成了4
cut(2);
}
size[3] = 0;
num += size[2]/9;
size[2] %= 9;
if(size[2])
{
num ++;
scrap[1] += (9-size[2])*4; //3.这个必须在size[2]!=0 的前提下
}
cut(1);
size[2] = 0;
num += size[1]/36;
size[1] %= 36; //2.zz一般的忘了处理size
if(size[1]) num ++;
printf("%d\n",num);
}
//fclose(stdin);fclose(stdout);
return 0;
}