zoukankan      html  css  js  c++  java
  • G

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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,模拟倒水,(相当于枚举)
     
      1 #include<cstdio>
      2 #include<string.h>
      3 using namespace std;
      4 int s,n,m,pre[1000005][3],ans[1000005];
      5 int vis[120][120];
      6 int ans1;
      7 void bfs()
      8 {
      9     int first=0,end=0,a,b,c;
     10     pre[end][0]=s;
     11     pre[end][1]=0;
     12     pre[end++][2]=0;
     13     vis[s][0]=1;
     14     while(first<end)
     15     {
     16         a=pre[first][0];
     17         b=pre[first][1];
     18         c=pre[first][2];
     19         if((a==b&&c==0)||(a==c&&b==0)||(b==c&&a==0))
     20         {
     21             ans1 =ans[first];
     22             return;
     23         }
     24     int a1,b1,c1;
     25         if(a+b>=n)
     26         {
     27             a1=a+b-n;
     28             b1=n;
     29             c1=c;
     30         }
     31         else{
     32             b1=a+b;
     33             a1=0;
     34             c1=c;
     35         }
     36         if(vis[a1][b1]==0)
     37         {
     38             vis[a1][b1]=1;
     39             pre[end][0]=a1;
     40             pre[end][1]=b1;
     41             pre[end][2]=c1;
     42             ans[end++]=ans[first]+1;
     43         }
     44         if(a+c>=m)
     45         {
     46             a1=a+c-m;
     47             c1=m;
     48             b1=b;
     49         }
     50         else{
     51             c1=a+c;
     52             a1=0;
     53             b1=b;
     54         }
     55         if(vis[a1][b1]==0)
     56         {
     57             vis[a1][b1]=1;
     58             pre[end][0]=a1;
     59             pre[end][1]=b1;
     60             pre[end][2]=c1;
     61             ans[end++]=ans[first]+1;
     62         }
     63         if(b+a>=s)
     64         {
     65             a1=s;
     66             b1=0;
     67             c1=c;
     68         }
     69         else{
     70             a1=a+b;
     71             b1=0;
     72             c1=c;
     73         }
     74          if(vis[a1][b1]==0)
     75         {
     76             vis[a1][b1]=1;
     77             pre[end][0]=a1;
     78             pre[end][1]=b1;
     79             pre[end][2]=c1;
     80             ans[end++]=ans[first]+1;
     81         }
     82         if(b+c>=m)
     83         {
     84             b1=b+c-m;
     85             c1=m;
     86             a1=a;
     87         }
     88         else{
     89             c1=b+c;
     90             b1=0;
     91             a1=a;
     92         }
     93          if(vis[a1][b1]==0)
     94         {
     95             vis[a1][b1]=1;
     96             pre[end][0]=a1;
     97             pre[end][1]=b1;
     98             pre[end][2]=c1;
     99             ans[end++]=ans[first]+1;
    100         }
    101         if(c+a>=s)
    102         {
    103             a1=s;
    104             c1=0;
    105             b1=b;
    106         }
    107         else{
    108             a1=a+c;
    109             c1=0;
    110             b1=b;
    111         }
    112          if(vis[a1][b1]==0)
    113         {
    114             vis[a1][b1]=1;
    115             pre[end][0]=a1;
    116             pre[end][1]=b1;
    117             pre[end][2]=c1;
    118             ans[end++]=ans[first]+1;
    119         }
    120         if(c+b>=n)
    121         {
    122             c1=c+b-n;
    123             b1=n;
    124             a1=a;
    125         }
    126         else{
    127             b1=b+c;
    128             c1=0;
    129             a1=a;
    130         }
    131          if(vis[a1][b1]==0)
    132         {
    133             vis[a1][b1]=1;
    134             pre[end][0]=a1;
    135             pre[end][1]=b1;
    136             pre[end][2]=c1;
    137             ans[end++]=ans[first]+1;
    138         }
    139         first++;
    140     }
    141 
    142 }
    143 int main()
    144 {
    145     while(scanf("%d %d %d",&s,&n,&m)&&(s+n+m))
    146     {
    147         if(s%2)
    148         {
    149             printf("NO
    ");
    150             continue;
    151         }
    152         ans1=0;
    153         memset(vis,0,sizeof(vis));
    154         bfs();
    155         if(ans1) printf("%d
    ",ans1);
    156         else printf("NO
    ");
    157     }
    158     return 0;
    159 }
  • 相关阅读:
    十大经典排序算法最强总结(含JAVA代码实现)
    Java相关官方链接
    强网杯2020(Funhash)
    强网杯2020(主动)
    强网杯2020(upload)
    (内存取证)46届世界技能大赛湖北省选拔赛
    (流量分析)46届世界技能大赛湖北省选拔赛
    CISCO ASA远程任意文件读取
    OOALV 分割屏幕
    Process Doppelg&#228;nging
  • 原文地址:https://www.cnblogs.com/angledamon/p/3932579.html
Copyright © 2011-2022 走看看