HDU 1495(BFS_H题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

-----------------------------------------------------------------------------------

题意:两个杯子一个瓶子,问能否平分可乐,如果能,输出最小步数;否则,输出"NO"。

思路:bfs基本的思路就不再赘述了。本题其实还有另外的想法:S==N+M是一个重要条件,保证至少有一个杯子可以盛下超过S/2的容量的可乐。然后,可以想到每次操作,可以得到两者的最大公约数,S/最大公约数-1就是结果,当然如果S/最大公约数不为偶数,证明不可行。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;

int gcd(int x, int y)
{
    if(y!=0)    return gcd(y, x % y);
    else return x;
}


int main(void){
    int S,N,M;
    while (scanf("%d %d %d",&S,&N,&M)&&(S!=0&&N!=0&&M!=0)) {
       S/=gcd(N,M);
       if(S%2==0)    printf("%d\n",S-1);
       else printf("NO\n");
    }
    return 0;

}
View Code

 

posted @ 2018-01-29 15:37  caomp  阅读(110)  评论(0)    收藏  举报