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"。

Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input
7 4 34 1 30 0 0
Sample Output
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;}


原创粉丝点击