poj 2709_模拟

题目描述:

   主要部分就是求一组颜色(每种颜色颜色剩余不同的量)中,三个三个能混合等同于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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值