感觉很多贪心的题目只要想到怎么贪心就很快能解决,但是没有想到的话代码量就会很大,而且很容易出错,所有贪心还是要多做题目,掌握各种贪心的题目
题目链接:https://vjudge.net/contest/231313#problem/D
0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0Sample Output
2 1
题目大意:有1*1,2*2···6*6尺寸的箱子,每种物品的高度确定,只用6*6的箱子,输入每种尺寸的物品有多少个,问你最少要用多少箱子,当六个0时推出循环
个人思路:6*6,5*5,4*4的物品每一个都需要一个箱子来放,所以先考虑,4个3*3物品占满一个箱子,考虑要多少个箱子,然后考虑已经用了的箱子能放多少个2*2的,不够的话再用箱子
最后考虑总共用了多少个箱子,把方块数求出来,减去用掉的方块数,就算当前的箱子能放的1*1的物品数量,不够再补箱子
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
#define INF 0x3f3f3f
int main()
{
ll a[10];
ll num[4]={0,5,3,1};
while(1)
{
ll ans=0;
ll tmp=0;
for(int i=1;i<=6;i++)
{
scanf("%I64d",&a[i]);
tmp+=a[i];
}
if(tmp==0)
return 0;
ans+=a[6]+a[5]+a[4]+(a[3]+3)/4;//a6,a5,a4每个物品需要一个箱子,4个a3需要一个箱子
ll a2=a[4]*5+num[a[3]%4];//a6,a5,a4,a3有多少个空位子可以放2*2的物品
if(a[2]>a2)
{
ans+=(a[2]-a2+8)/9;
}
int a1=ans*36-a[6]*36-a[5]*25-a[4]*16-a[3]*9-a[2]*4;//总共用的箱子还剩多少个能放a1
if(a[1]>a1)
{
ans+=(a[1]-a1+35)/36;
}
printf("%I64d\n",ans);
}
return 0;
}
原文:https://www.cnblogs.com/caijiaming/p/9304259.html