[kuangbin带你飞]专题一 简单搜索 M - 非常可乐 HDU 1495

49 篇文章 0 订阅
18 篇文章 0 订阅


Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
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 
         
       
      
      
     
     
    
    
   
   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值