题目描述:
主要部分就是求一组颜色(每种颜色颜色剩余不同的量)中,三个三个能混合等同于grey颜色。买这样一套的一组颜色(一套就是每种颜色+50),求灰颜色的量,需要由剩余的颜色量,再买几套,可以混合成。
解题思路:
把这组剩余的颜色按量排序。每次剩余量最多的三组,每混合一次重新排序一次。(需要注意的是:要按1为单位混合,而不是混合第三组的量)。不能混合后,再加上一套。循环直到混合成功的灰颜色量>=所需要。
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 13
int grey, color[N], left[N], count, n;
int partition(int low, int high)
{
int tmp = left[low];
while(low < high)
{
while(low < high && left[high] <= tmp)
high --;
if(low < high)
left[low++] = left[high];
while(low < high && left[low] >= tmp)
low ++;
if(low < high)
left[high--] = left[low];
}
left[low] = tmp;
return low;
}
void sort(int low, int high)
{
int index;
if(low < high)
{
index = partition(low, high);
sort(low, index-1);
sort(index+1, high);
}
}
main()
{
int i,j,n,max,sum;
scanf("%d",&n);
while(n!=0)
{
max = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&color[i]);
if(max < color[i])
max = color[i];
}
scanf("%d",&grey);
// at least buy how many bags
count = max/50;
if(max % 50 != 0)
count++;
for(i=1;i<=n;i++)
left[i] = 50*count - color[i];
sort(1,n);//降序
sum = 0;
while(1)
{
while(3<=n && left[3]>0)
{
sum ++;
for(j=1;j<=3;j++)
left[j] --;
sort(1,n);
}
if(sum < grey)
{
count ++;
for(i=1;i<=n;i++)
left[i] += 50;
}
else
break;
}
printf("%d\n",count);
scanf("%d",&n);
}
return 0;
}