poj 2709

http://poj.org/problem?id=2709

题意:就是那个老师需要n瓶颜色的墨水,和1瓶颜色的灰色的墨水,但是灰色的墨水没得卖,只能由三种颜色相同的墨水混合而成,但是3瓶50ML的墨水也只能混合出1瓶50ML的墨水,这些墨水最多是有12瓶的,最少是3瓶,但不是这些墨水都是需要购买的,只需要购买这些老师所需要的颜色的墨水,每一瓶的墨水有50ML,老师所买的N瓶颜色不同的墨水为一套,问老师最少需要购买多少套的墨水。

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> int cmp(const void *a,const void *b)
{
return (*(int *)a)-(*(int *)b);
} int main()
{
int color[],nous[],gray,i,ans,n,mark,max1; //color 用来存每种颜色需要的量,nous也就是no user 每一套剩余使用的墨水的量
while(scanf("%d",&n),n!=)
{
memset(color,,sizeof(color));
for(i=,ans=;i<n;i++)
scanf("%d",&color[i]);
scanf("%d",&gray);
for(i=,max1=,mark=n;i<n;i++)
{
if(color[i]>max1) max1=color[i]; //找出需要最多量的拿一瓶墨水,并记录下来它的量,因为他的量就有可能是最少需要的墨水的套数 }
if(max1%==) ans=max1/; //如果最大的量可以整除50,那么刚好最多的就是它除以50的套数,否则有多余的都需要在多买一套
else ans=max1/+; /* for(i=;i<mark;i++)
if(color[i]==) n--;*/ //这个没什么意义,因为之前理解错了题意
for(i=;i<mark;i++) //有ans套的墨水,有多少是剩下来没用的,之后就可以用这些来混合出灰色的
nous[i]=ans*-color[i];
for(;;)
{
qsort(nous,mark,sizeof(nous[]),cmp); //对这些剩余墨水的量由小到大进行排序,并且每一次都是混合出1ml的墨水,为什么要这些,一组数据你就会懂,就是3 3 3 3 有可能是3 0 0 0或者
// 0 0 0 0 下面这种就是每次减1ml进行然后在重新进行排序,上面的就是直接减倒数第3个墨水瓶的数
if(nous[mark-]==&&gray>){
for(i=;i<mark;i++)
nous[i]=nous[i]+;
ans++;
}
nous[mark-]--;
nous[mark-]--;
gray--;
nous[mark-]--;
if(gray<=) break;
}
printf("%d\n",ans);
}
return ;
}
上一篇:【BZOJ】【1532】【POI2005】Kos-Dicing


下一篇:安装Android SDK和ADT步骤和遇到的问题