POJ 2709 Painter
题意:
输入n,表示需要几种颜色,接下来输入n个数字,表示每种颜色需要的毫升数,最后输入一个数字,代表灰色需要的毫升数。
1ml灰色颜料可以由3种不同的颜料各1ml混合而成。
一套颜料包含了所有颜色(除了灰色) 各50ml, 现在要求出,所需要最少的颜料包,来满足输入的需求。
解法:用贪心,先把其他颜料弄到满足需求,拿出剩余的的颜料来合成灰色,从颜料剩余ml最多的颜料优先合成,每次就合成1ml,如果不够,就增加颜料包,直到灰色满足需求。
#include <stdio.h>
#include <string.h>
int n;
int color[15];
int g;
int i;
int sum;
int find_max()
{
int i;
int max = color[0];
for (i = 0; i < n; i ++)
if (max < color[i])
max = color[i];
return max;
}
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
void judge()
{
int i ,j;
int m[3];
int vis[20];
int bs[20];
memset(m, 0, sizeof(m));
memset(bs, 0, sizeof(bs));
memset(vis, 0, sizeof(vis));
for (i = 0; i < 3; i++)
{
for (j = 0; j < n; j++)
if (m[i] <= color[j] && vis[j] == 0)
{
m[i] = color[j];
bs[i] = j;
}
vis[bs[i]] = 1;
}
for (i = 0; i < 3; i ++)
{
if (m[i] == 0)
{
for(j = 0; j < n; j++)
{
color[j] += 50;
}
for (j = 0; j < 3; j ++)
m[j] += 50;
sum ++;
break;
}
}
g -= 1;
for (i = 0; i < 3;i ++)
color[bs[i]] -= 1;
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
memset(color, 0, sizeof(color));
sum = 0;
for (i = 0; i < n; i ++)
scanf ("%d", &color[i]);
scanf("%d", &g);
sum += (find_max() + 49)/50;
for (i = 0; i < n; i ++)
{
color[i] = sum * 50 - color[i];
}
while (g)
{
judge();
}
printf("%d\n",sum);
}
return 0;
}