Appoint description:
Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当
seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou
一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S
(S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且
S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输
出倒可乐的最少的次数,如果不能输出"NO"。
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input
7 4 3 4 1 3 0 0 0
Sample Output
NO 3
分6个情况
s -> n s-> n n -> s n -> m m ->s m ->n
#include
#include
#include
#include
using namespace std;
int a[1000005];
int s,n,m;
struct node
{
int ss,nn,mm,tep;
};
node xx,yy;
void fun()
{
yy.ss=xx.ss;
yy.nn=xx.nn;
yy.mm=xx.mm;
yy.tep=xx.tep+1;
}
queue
Q; int bfs() { int temp=0; while(!Q.empty())Q.pop(); xx.ss=s; xx.nn=xx.mm=xx.tep=0; Q.push(xx); a[xx.ss+xx.nn*100+xx.mm*10000]=1; while(!Q.empty()) { xx=Q.front(); Q.pop(); fun(); if(xx.ss>0) { temp=min(xx.ss+xx.nn,n); ///s -> n yy.ss=xx.ss+xx.nn-temp; yy.nn=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } fun(); temp=min(xx.ss+xx.mm,m); ///s -> m yy.ss=xx.ss+xx.mm-temp; yy.mm=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } fun(); } if(xx.nn>0) { temp=min(xx.ss+xx.nn,s); ///n -> s yy.nn=xx.ss+xx.nn-temp; yy.ss=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } fun(); temp=min(xx.mm+xx.nn,m); ///n -> m yy.nn=xx.nn+xx.mm-temp; yy.mm=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } } if(xx.mm>0) { fun(); temp=min(xx.ss+xx.mm,s); ///m -> s yy.mm=xx.mm+xx.ss-temp; yy.ss=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } fun(); temp=min(xx.mm+xx.nn,n); ///m -> n yy.mm=xx.mm+xx.nn-temp; yy.nn=temp; if(yy.ss==yy.nn&&yy.ss+yy.nn==s) return yy.tep; if(a[yy.ss+yy.nn*100+yy.mm*10000]==0) { a[yy.ss+yy.nn*100+yy.mm*10000]=1; Q.push(yy); } } } return 0; } int main() /// if(s==n) YES else NO { int flag,ans; while(scanf("%d%d%d",&s,&n,&m),s) { flag=1; if(n==m) { printf("1\n"); continue; } if(n