• HDU1495 非常可乐


    题目:

    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

    输入:

    三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

    输出:

    如果能平分的话请输出最少要倒的次数,否则输出"NO"。

    样例:

    分析:挺简单一BFS但是那个循环里的破玩意我打错了好几个的地方,被自己蠢哭了◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣

      1 #include<iostream>
      2 #include<sstream>
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<string>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<functional>
      9 #include<iomanip>
     10 #include<numeric>
     11 #include<cmath>
     12 #include<queue>
     13 #include<vector>
     14 #include<set>
     15 #include<cctype>
     16 #define PI acos(-1.0)
     17 const int INF = 0x3f3f3f3f;
     18 const int NINF = -INF - 1;
     19 typedef long long ll;
     20 using namespace std;
     21 struct node
     22 {
     23     int x, y, z;
     24 }st;
     25 int a, b, c;
     26 int d[105][105][105];
     27 int used[105][105][105];
     28 int bfs()
     29 {
     30     queue<node> q;
     31     memset(used, 0, sizeof(used));
     32     for (int i = 0; i <= a; ++i)
     33     {
     34         for (int j = 0; j <= b; ++j)
     35         {
     36             for (int k = 0; k <= c; ++k)
     37                 d[i][j][k] = INF;
     38         }
     39     }
     40     st.x = a, st.y = 0, st.z = 0;
     41     q.push(st);
     42     used[st.x][st.y][st.z] = 1;
     43     d[st.x][st.y][st.z] = 0;
     44     while (q.size())
     45     {
     46         node temp;
     47         temp = q.front();
     48         q.pop();
     49         if ((temp.x == temp.y && temp.z == 0) || (temp.x == temp.z && temp.y == 0) || (temp.y == temp.z && temp.x == 0))
     50             return d[temp.x][temp.y][temp.z];
     51         for (int i = 0; i < 6; ++i)
     52         {
     53             node n = temp;
     54             if (i == 0 && n.x != 0)
     55             {
     56                 if (n.x + n.y >= b)
     57                 {
     58                     n.x -= b - n.y;
     59                     n.y = b;
     60                 }
     61                 else
     62                 {
     63                     n.y += n.x;
     64                     n.x = 0;
     65                 }
     66             }
     67             if (i == 1 && n.x != 0)
     68             {
     69                 if (n.x + n.z >= c)
     70                 {
     71                     n.x -= c - n.z;
     72                     n.z = c;
     73                 }
     74                 else
     75                 {
     76                     n.z += n.x;
     77                     n.x = 0;
     78                 }
     79             }
     80             if (i == 2 && n.y != 0)
     81             {
     82                 if (n.x + n.y >= a)
     83                 {
     84                     n.y -= a - n.x;
     85                     n.x = a;
     86                 }
     87                 else
     88                 {
     89                     n.x += n.y;
     90                     n.y = 0;
     91                 }
     92             }
     93             if (i == 3 && n.y != 0)
     94             {
     95                 if (n.z + n.y >= c)
     96                 {
     97                     n.y -= c - n.z;
     98                     n.z = c;
     99                 }
    100                 else
    101                 {
    102                     n.z += n.y;
    103                     n.y = 0;
    104                 }
    105             }
    106             if (i == 4 && n.z != 0)
    107             {
    108                 if (n.x + n.z >= a)
    109                 {
    110                     n.z -= a - n.x;
    111                     n.x = a;
    112                 }
    113                 else
    114                 {
    115                     n.x += n.z;
    116                     n.z = 0;
    117                 }
    118             }
    119             if (i == 5 && n.z != 0)
    120             {
    121                 if (n.y + n.z >= b)
    122                 {
    123                     n.z -= b - n.y;
    124                     n.y = b;
    125                 }
    126                 else
    127                 {
    128                     n.y += n.z;
    129                     n.z = 0;
    130                 }
    131             }
    132             if (!used[n.x][n.y][n.z])
    133             {
    134                 used[n.x][n.y][n.z] = 1;
    135                 q.push(n);
    136                 d[n.x][n.y][n.z] = d[temp.x][temp.y][temp.z] + 1;
    137             }
    138         }
    139     }
    140     return -1;
    141 }
    142 int main()
    143 {
    144     while (cin >> a >> b >> c)
    145     {
    146         if (a == 0 && b == 0 && c == 0) break;
    147         if (a % 2)
    148         {
    149             cout << "NO" << endl;
    150             continue;
    151         }
    152         int ans = bfs();
    153         if (ans != -1)
    154             cout << ans << endl;
    155         else cout << "NO" << endl;
    156     }
    157     return  0;
    158 }
  • 相关阅读:
    归档模式与非归档模式之间的转换
    Cognos 常见错误解决办法
    Informatica 错误信息解决办法汇总
    转摘:解决动态列固定行月季年组合式报表
    数据库名、实例名、全局数据库名、服务名的区别
    转摘:维度与指标混合嵌入(合计)设计
    WinForm使用XML动态加载多语言
    windows中最重要的三个动态链接库及功能
    什么是.Net的异步机制(Invoke,BeginInvoke,EndInvoke) step 2
    深入理解.net服务器控件
  • 原文地址:https://www.cnblogs.com/veasky/p/10995183.html
Copyright © 2020-2023  润新知