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; }

浙公网安备 33010602011771号