HDU
来源:互联网 发布:怎么样让淘宝店铺升钻 编辑:程序博客网 时间:2024/05/16 11:42
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
7 4 34 1 30 0 0
NO
3
这题真的很迷,tle了十几遍我一直感觉自己思路没问题,重写是十几遍终于过了,我发现问题出在一个判断条件上
我刚开始想如果n和m都小于s的一半直接输出NO,结果就一直tle,ac那发把那个条件去了结果过了,再加上又tle...
真的很迷..
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;typedef struct{ int s, n, m; int step;}node;int s, n, m;int v[120][120][120];void bfs(){ node a, b; queue<node>q; a.s = s; a.n = 0; a.m = 0; a.step = 0; v[a.s][a.n][a.m] = 1; q.push(a); while(!q.empty()) { a = q.front(); q.pop(); if((a.s == a.n && a.m == 0) || (a.s == a.m && a.n == 0) || (a.n == a.m && a.s == 0)) { cout<<a.step<<endl; return; } if(a.s > 0 && a.n < n) { if(a.s <= n - a.n) { b.n = a.n + a.s; b.s = 0; } else { b.n = n; b.s = a.s - (n - a.n); } b.m = a.m; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } if(a.s > 0 && a.m < m) { if(a.s <= m - a.m) { b.m = a.s + a.m; b.s = 0; } else { b.m = m; b.s = a.s - (m - a.m); } b.n = a.n; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } if(a.n > 0 && a.s < s) { if(a.n <= s - a.s) { b.s = a.s + a.n; b.n = 0; } else { a.s = s; b.n = a.n - (s - a.s); } b.m = a.m; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } if(a.n > 0 && a.m < m) { if(a.n <= m - a.m) { b.m = a.m + a.n; b.n = 0; } else { b.m = m; b.n = a.n - (m - a.m); } b.s = a.s; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } if(a.m > 0 && a.s < s) { if(a.m <= s - a.s) { b.s = a.s + a.m; b.m = 0; } else { b.s = s; b.m = a.m - (s - a.s); } b.n = a.n; b.step = a.step + 1; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } if(a.m > 0 && a.n < n) { if(a.m <= n - a.n) { b.n = a.n + a.m; b.m = 0; } else { b.n = n; b.m = a.m - (n - a.n); } b.s = a.s; b.step = a.step + 1; b.step = a.step + 1; if(!v[b.s][b.n][b.m]) { v[b.s][b.n][b.m] = 1; q.push(b); } } } cout<<"NO"<<endl;}int main(){ while(cin>>s>>n>>m && (s || n || m)) { if(s % 2 != 0) cout<<"NO"<<endl; else { memset(v,0,sizeof(v)); bfs(); } } return 0;}