题目连接:https://vjudge.net/problem/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 Inputios
7 4 3 4 1 3 0 0 0
Sample Outputc++
NO 3
解题思路一:数论解法,证实可见:https://blog.csdn.net/xiaolonggezte/article/details/70795894
Cpp Codespa
#include<bits/stdc++.h> using namespace std; int main() { int a,b,c; while( ~ scanf("%d%d%d",&a,&b,&c)) { if(a == 0 && b == 0 && c == 0) break; int g = __gcd(b,c); if((b + c) / g % 2) { cout << "NO" << endl; continue; } cout << (b + c) / g - 1 << endl; } return 0; }
解题思路二:开始的时候,全部可乐在s中,2个杯子n和m都空着。过程当中,能够将任何1个容器中的可乐倒到另外某个容器中,或将目标容器倒满,或将源容器倒空。由于容器没有刻度,只能这样。这个过程当中,若是出现某个容器空,另外2个容器可乐相同则成功。若是开始的时候,可乐的容量是奇数,则不可能平分可乐。容器间可乐倒来倒去,每次有6种倒法,对这6种倒法进行试探便可。求的是最少倒的次数,因此能够用BFS实现。.net
Cpp Codecode
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std; const int maxn = 110; struct Status{ int s, a, b, t; } st; bool vis[maxn][maxn]; int s, a, b; int bfs(){ queue<Status> q; memset(vis, 0, sizeof(vis)); st.a = 0; st.b = 0; st.s = s; st.t = 0; vis[a][b] = 1; q.push(st); while (!q.empty()) { Status v, u = q.front(); if(u.a==s/2&&u.s==s/2){ return u.t; } if(u.s&&u.a!=a){ int c = a - u.a; if(u.s>=c){ v.a = a; v.s = u.s - c; } else{ v.a = u.a + u.s; v.s = 0; } v.b = u.b; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } if(u.s&&u.b!=b){ int c = b - u.b; if(u.s>=c){ v.b = b; v.s = u.s - c; } else{ v.b = u.b + u.s; v.s = 0; } v.a = u.a; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } if(u.a&&u.b!=b){ int c = b - u.b; if(u.a>=c){ v.b = b; v.a = u.a - c; } else{ v.b = u.b + u.a; v.a= 0; } v.s = u.s; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } if(u.a&&u.s!=s){ int c = s - u.s; if(u.a>=c){ v.s = s; v.a = u.a - c; } else{ v.s = u.s + u.a; v.a= 0; } v.b = u.b; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } if(u.b&&u.a!=a){ int c = a - u.a; if(u.b>=c){ v.a = a; v.b = u.b - c; } else{ v.a = u.a + u.b; v.b= 0; } v.s = u.s; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } if(u.b&&u.s!=s){ int c = s - u.s; if(u.b>=c){ v.s = s; v.b = u.b - c; } else{ v.s = u.s + u.b; v.b= 0; } v.a = u.a; v.t = u.t + 1; if(!vis[v.a][v.b]){ vis[v.a][v.b] = 1; q.push(v); } } q.pop(); } return 0; } int main(){ while ((cin>>s>>a>>b)&&(a||b||s)) { if(s%2==1){ cout << "NO" << endl; } else{ if(a<b){ swap(a, b); } int ans = bfs(); if(ans){ cout << ans << endl; } else{ cout << "NO" << endl; } } } return 0; }