G - 非常可乐

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

Submit Status Practice HDU 1495

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\n");
150             continue;
151         }
152         ans1=0;
153         memset(vis,0,sizeof(vis));
154         bfs();
155         if(ans1) printf("%d\n",ans1);
156         else printf("NO\n");
157     }
158     return 0;
159 }
时间: 2024-08-05 18:22:19

G - 非常可乐的相关文章

HDU 1495 非常可乐(BFS 倒水问题)

题意  将体积为s的可乐  利用容积分别为n和m的两个杯子平均分为两份  至少需要倒多少次可乐 可以把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的  所以每次倒可乐要么把自己倒完 要么把对方倒满 每种状态可以通过一次倒水到达哪些状态  于是可以通过bfs判断到达每种状态需要倒多少次 3个容器中有一个装的可乐为s/2的状态就是答案了  s是奇数时明显不可能平分的  可以直接忽略 #include <cstdio> #include <cstring> using nam

Codefroces 852 G. Bathroom terminal

G. Bathroom terminal Smith wakes up at the side of a dirty, disused bathroom, his ankle chained to pipes. Next to him is tape-player with a hand-written message "Play Me". He finds a tape in his own back pocket. After putting the tape in the tap

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

张书乐:死活撩不到粉丝G点,内容创业者该咋整?

内容创业的大风口来了,可不是吗!那一年不是内容创业的风口. 1980年代,是朦胧诗.报告文学和武侠:1990年代,言情与少女,新世纪里就更多了,网络文学.网络影视以及各种IP大阵,现在则是自媒体的内容创业. 只是,有时候是来赚钱的,有时候是来赚名的,总的来说,都是来赚存在感的. 文/张书乐(人民网.人民邮电报专栏作家) 新著有<微博运营完全自学手册> 各家平台都准备好了,微信公号里集合了超过千万的运营者:微博再度复活,开始分门别类的做垂直内容:连天涯社区这个老化石,都推出了天涯号,想要拉拢一把

gcc/g++命令

参考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html 注意:gcc和g++是linux系统下的编程常用指令,C语言文件用gcc,cpp文件用g++. 1.预处理  g++ -E filename.cpp > filename.i 功能:输出预处理后的文件,linux下以.i为后缀名.只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 . 这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的

win7,M?i?n?d?m?a?n?a?g?e?r?2?0?1?2使用模板时弹出Runtime error R6025解决方法

Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\AppData\Local\Mindjet\MindManager\10\Library\ENU\Templates, 可以看到如下模板:Management/Meetings and Events/Personal Productivity/Problem Solving/Project Management

CentOS安装g++

本文为个人学习记录. 一.一般操作 Centos支持使用yum安装,安装软件一般格式为yum install....,注意此时是在root权限下. 1 yum install gcc-c++ 二.若出现: 说明此时不是在root权限下,只需输入:su,然后在输入密码以后,重新输入上述命令即可. 最后可以使用一下操作查看是否安装成功 1 which g++ Ref: http://blog.csdn.net/dream_1996/article/details/69397089

2017Summmer_上海金马五校 F题,G题,I题,K题

以下题目均自己搜 F题  A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R,然后对整个数组扫一遍对于每一个下标取m=min(L[i],R[i]);用ans取2*m-1中的最大值.LIS用nlogn的算法实现,二分用的是lower_bound(),直接看代码. //Author: xiaowuga #include <bits/stdc++.h> #define maxx

codeforces gym101243 A C D E F G H J

gym101243 A 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #include<bit