HDU 3573 Buy Sticks 贪心--利用率

题意:有20,28,32cm长的棒子,是我需要的,现在商店只有75cm长的棒子,现在要把75cm的棒子截成那三个长度的棒子(不能拼凑,不能用10cm+10cm=20cm类似),问你至少需要多少棒子。


思路:我又是被利用率的贪心给虐了。这下要长一点记性了,来看这题。

首先,我当然我希望75cm的棒子剩下的废料越少越好,那么最好的组合当然是3个短的棒子,其中rate最高的是top1:20 20 32,其次top2:20 20 28,最差top3:20 20 20。这样看来,首先考虑这三种情况,那么剩下来的棒子只能组成2个短棒子的情况了,那就是剩余的短棒子的个数,除以2,那么我们可以想到,如果要是有奇数个短棒子剩余那么久还需要一个长棒子,所以答案是向上取整数,所以(短棒子数+1)/2。

//利用率 
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n20,n28,n32;
int a[100+5];
void Input()
{scanf("%d%d%d",&n20,&n28,&n32);
}
int MIN(int a,int b)
{if(a<b) return a;return b;
}
void treatment(int ca)
{int sum=0,t;t=MIN(n20/2,n32);sum+=t;n20-=2*t;n32-=t;t=MIN(n20/2,n28);sum+=t;n20-=2*t;n28-=t;t=n20/3;sum+=t;n20-=3*t;sum+=(n20+n28+n32+1)/2;printf("Case %d: %d\n",ca,sum);
}
int main()
{int t,ca=1;scanf("%d",&t);while(t--){Input();treatment(ca++);}return 0;
}