| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 3157 | Accepted: 1962 |
Description
Input
Output
Sample Input
3 40 95 21 0 7 25 60 400 250 0 60 0 500 4 90 95 75 95 10 4 90 95 75 95 11 5 0 0 0 0 0 333 0
Sample Output
2 8 2 3 4
首先除了灰色,其他颜色需要多少组颜料,然后求出辣么多组,每个颜料的余量,用剩余的去陪灰色
然后贪心策略:
每次取最多的三种颜色各1ml,配出1ml的灰色,
然后排序,重复上述过程,如果最多的三种颜色中,有一个为0,那么就要加一组,
然后所有颜色加上50ml,再重复上述过程,直到配出要求的那么多灰色
上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int colors[20];
bool cmp(int a,int b) //从大到小排序
{
return a>b;
}
int main()
{
freopen("1003.in","r",stdin);
// freopen("1003.out","w",stdout);
int N,G;
while(scanf("%d",&N)!=EOF)
{
if(N==0)
break;
int countn=0;
for(int i=0;i<N;i++)
scanf("%d",colors+i);
scanf("%d",&G);
sort(colors,colors+N,cmp);
if(colors[0]%50==0) //排序之后,colors[0]是最多的,如果能整除50,就那么多组
countn=colors[0]/50;
else
countn=colors[0]/50+1; //如果不能整除50,要加上一组,整除直接舍弃小数位
for(int i=0;i<N;i++) //求出各个颜色的余量
colors[i]=countn*50-colors[i];
while(G>0)
{
sort(colors,colors+N,cmp);
if(!colors[0] || !colors[1] || !colors[2]) //如果最多的三个颜色中,有一个用光了,但此时灰色还没配齐,就要加一组
{
countn++;
for(int i=0;i<N;i++) //加了一组,所有颜色都要加上50ml
colors[i]+=50;
}
G--; //每次配1ml
colors[0]--; //最多的用掉1ml
colors[1]--; //次多的用掉1ml
colors[2]--; //第三多的用掉1ml
}
printf("%d\n",countn);
}
return 0;
}
原文地址:http://blog.csdn.net/u013795055/article/details/38759523