zoukankan      html  css  js  c++  java
  • HDU

    先上题目:

    非常可乐

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4482    Accepted Submission(s): 1815


    Problem 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
     
      中文题意不解释,直接BFS即可,广搜的时候需要记录的是当前的三个杯子的状态,然后判定一下重复就可以了。这里用set保存已经进行扩展了的状态。
     
    上代码:
     
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <set>
      5 #include <queue>
      6 #include <utility>
      7 #define x first
      8 #define y second
      9 using namespace std;
     10 
     11 typedef pair<pair<int,int>,int> piii;
     12 int s,n,m,ti;
     13 
     14 set<piii> ss;
     15 
     16 bool isok(piii a){
     17     if(a.x.x*2==s && a.x.y*2==s) return 1;
     18     else if(a.x.x*2==s && a.y*2==s) return 1;
     19     else if(a.x.y*2==s && a.y*2==s) return 1;
     20     return 0;
     21 }
     22 
     23 inline piii mpiii(int a,int b,int c) { return make_pair( make_pair(a,b) , c ); }
     24 
     25 bool check(){
     26     ti=0;
     27     queue<pair<piii,int> > q;
     28     pair<piii,int> tt;
     29     piii u = mpiii(s,0,0);
     30     q.push(make_pair(u,0));
     31     ss.insert(u);
     32     while(!q.empty()){
     33         int tti;
     34         tt = q.front();
     35         q.pop();
     36         u = tt.x;
     37         tti = tt.y;
     38         //s-->n
     39         if(u.x.x>0 && (n-u.x.y)>0){
     40             if(  u.x.x > (n-u.x.y)  ){ u.x.x-=(n-u.x.y); u.x.y=n; }
     41             else{ u.x.y+=u.x.x; u.x.x=0;  }
     42             if(ss.count(u)<=0){
     43                 tti++;
     44                 if(isok(u)){ti=tti; return 1;}
     45                 ss.insert(u);
     46                 q.push( make_pair(u,tti) );
     47             }
     48         }
     49         //s-->m
     50         u = tt.x;
     51         tti = tt.y;
     52         if(u.x.x>0 && (m-u.y)>0){
     53             if(  u.x.x > (m-u.y)  ){ u.x.x-=(m-u.y); u.y=m; }
     54             else{ u.y+=u.x.x; u.x.x=0; }
     55             if(ss.count(u)<=0){
     56                 tti++;
     57                 if(isok(u)){ti=tti; return 1;}
     58                 ss.insert(u);
     59                 q.push( make_pair(u,tti) );
     60             }
     61         }
     62         //n-->s
     63         u = tt.x;
     64         tti = tt.y;
     65         if(u.x.y>0 && (s-u.x.x)>0){
     66             if(  u.x.y > (s-u.x.x)  ){ u.x.y-=(s-u.x.x); u.x.x=s; }
     67             else{ u.x.x+=u.x.y; u.x.y=0; }
     68             if(ss.count(u)<=0){
     69                 tti++;
     70                 if(isok(u)){ti=tti; return 1;}
     71                 ss.insert(u);
     72                 q.push( make_pair(u,tti) );
     73             }
     74         }
     75         //n-->m
     76         u = tt.x;
     77         tti = tt.y;
     78         if(u.x.y>0 && (m-u.y)>0){
     79             if(  u.x.y > (m-u.y)  ){ u.x.y-=(m-u.y); u.y=m; }
     80             else{ u.y+=u.x.y; u.x.y=0;}
     81             if(ss.count(u)<=0){
     82                 tti++;
     83                 if(isok(u)){ti=tti; return 1;}
     84                 ss.insert(u);
     85                 q.push( make_pair(u,tti) );
     86             }
     87         }
     88         //m-->s
     89         u = tt.x;
     90         tti = tt.y;
     91         if(u.y>0 && (s-u.x.x)>0){
     92             if(  u.y > (s-u.x.x)  ){ u.y-=(s-u.x.x); u.x.x=s; }
     93             else{ u.x.x+=u.y; u.y=0; }
     94             if(ss.count(u)<=0){
     95                 tti++;
     96                 if(isok(u)){ti=tti; return 1;}
     97                 ss.insert(u);
     98                 q.push( make_pair(u,tti) );
     99             }
    100         }
    101         //m-->n
    102         u = tt.x;
    103         tti = tt.y;
    104         if(u.y>0 && (n-u.x.y)>0){
    105             if(  u.y > (n-u.x.y)  ){ u.y-=(n-u.x.y); u.x.y=n; }
    106             else{ u.x.y+=u.y; u.y=0; }
    107             if(ss.count(u)<=0){
    108                 tti++;
    109                 if(isok(u)){ti=tti; return 1;}
    110                 ss.insert(u);
    111                 q.push( make_pair(u,tti) );
    112             }
    113         }
    114     }
    115     return 0;
    116 }
    117 
    118 int main()
    119 {
    120     //freopen("data.txt","r",stdin);
    121     while(scanf("%d %d %d",&s,&n,&m),(s+n+m)){
    122         ss.clear();
    123         if( (s&1)==0 && check()) printf("%d
    ",ti);
    124         else printf("NO
    ");
    125     }
    126     return 0;
    127 }
    1495
     
  • 相关阅读:
    HTTP请求头的具体含意
    Python 之类与对象及继承
    PHP的一个牛逼的数组排序函数array_multisort
    mysqli返回受影响行数
    转:JS判断值是否是数字(两种方法)
    转:php中判断某个IP地址是否存在范围内
    php Closure::bind的用法(转)
    Drupal8入门文章推荐
    PHP通过api上传图片
    转:PHP中的使用curl发送请求(GET请求和POST请求)
  • 原文地址:https://www.cnblogs.com/sineatos/p/3847006.html
Copyright © 2011-2022 走看看