HDU1495 很是可乐(两种解法)

题目连接: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;
}
相关文章
相关标签/搜索