链接:http://poj.org/problem?id=2709
这个题总体来说还是很简单的,不过有一个地方要注意。
题意:有种颜料套装(颜色种类3到12),其中每种颜料有50ml,然后任何Xml的三种颜料可以混合成灰色颜料。现在,一老师,需要N种颜料,每种颜料的需求量告知,并需要一些灰色颜料。问,最少需要几套颜料即可满足颜料所需。、
本题的关键是:选出剩下颜料中的最大(贪心思想)数量的三种颜料进行混合,而变成灰色。在颜料混合时,要每次1ml的减。
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return (a-b)>0;
}
int main()
{
int n,maxc,ans,gray,total;//ans表示套数,total表示目前的灰色数量
int color[12],rest[12];
int i;
while(cin>>n&&n)
{
maxc=0; //maxc颜料中需求量最大的一种
for(i=0;i<n;i++)
{
cin>>color[i];
if(maxc<color[i])
maxc=color[i];
}
ans=maxc/50+((maxc%50==0)?0:1);//用maxc求目前为止最少的套数
cin>>gray;
for(i=0;i<n;i++)
rest[i]=50*ans-color[i];//求剩下的颜料,用于生成灰色
sort(rest,rest+n,cmp); //排序,为了取前三大颜料
total=0; //未混合之前,灰色为0
while(total<gray)
{
if(rest[0]&&rest[1]&&rest[2])//如果前三大颜料不为0,可以继续减,即混合
{
rest[0]--;
rest[1]--;
rest[2]--; //每次减1ml
total++; //灰色加1ml1
sort(rest,rest+n,cmp); //再排序,求前三大颜料
}
else //不能减了,则要再加一套颜料
{
for(i=0;i<n;i++)
rest[i]+=50;
sort(rest,rest+n,cmp); //再排序
ans++; //颜料的套数增加
}
}
cout<<ans<<endl;
}
return 0;
}