HDU-1495-非常可乐
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1495
这题搞不出,看了一位牛逼的人的代码思路
两个杯子按大小排序,为S>M>N,
1.只要n满了,就把n里的东西放到s中
2.只要m非空,就把m中的放到n中
3.如果m为空,把s中的放到m中。
-----------------------------------------------------------------------------------------------------------------
//平分可乐的问题
//一桶可乐S升,两个杯子M和N升,
//平分所需的最小次数
#include<stdio.h>
int s;
int a;
int b;
int ss;
int aa;
int bb;
int num;
int main()
{
while(scanf("%d%d%d",&s,&a,&b)==3&&(s+a+b))
{
if(a<b)
a=a^b^(b=a);
ss=s;
aa=0;
bb=0;
num=0;
while(1)
{
if(ss==b && aa==a && num>1)//出现了死循环
{
printf("NO\n");
break;
}
if(ss==aa && bb==0)
{
printf("%d\n",num);
break;
}
if(bb==b)
{
ss+=b;
bb=0;
num++;
continue;
}
if(aa>0 && aa<=a)
{
if(aa+bb>b)
{
aa=aa+bb-b;
bb=b;
}
else if(aa+bb<=b)
{
bb+=aa;
aa=0;
}
num++;
}
else if(aa==0||aa>a)
{
if(ss>=a)
{
ss-=a;
aa=a;
}
else
{
aa=ss;
ss=0;
}
num++;
}
}
}
return 0;
}