• 九度oj 题目1457:非常可乐


    题目描述:

    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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"。

    样例输入:
    7 4 3
    4 1 3
    0 0 0
    
    样例输出:
    NO
    3
    
    这个题一开始也是没什么思路。这些瓶子倒来倒去真实麻烦。后来反应过来应该用深搜或广搜来解决此类问题。深搜的代码写了一半,突然发觉还是用广搜更好些
    代码如下
      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <queue>
      5 #include <algorithm>
      6 using namespace std;
      7 
      8 int v[110][110][110];
      9 
     10 int ans = -1;
     11 int s, n, m;
     12 struct State
     13 {
     14     int a, b, c;
     15     State(int a, int b, int c) {
     16         this->a = a, this->b = b, this->c = c;
     17     }
     18 };
     19 queue <State>que;
     20 
     21 int main(int argc, char const *argv[])
     22 {
     23 
     24     while (scanf("%d %d %d", &s, &n, &m) != EOF && (s != 0 && n != 0 && m != 0)) {
     25         if (s & 1) {
     26             puts("NO");
     27         }
     28         else {
     29             int ans = -1;
     30             memset(v, -1, sizeof(v));
     31             while (!que.empty()) {
     32                 que.pop();
     33             }
     34             que.push(State(s, 0, 0));
     35             v[s][0][0] = 0;
     36             while (!que.empty()) {
     37                 State p = que.front(); que.pop();
     38                 if ((p.a == p.b && p.a == s/2) || (p.a == p.c && p.a == s/2) || (p.b == p.c && p.b == s/2)) {
     39                     ans = v[p.a][p.b][p.c];
     40                     break;
     41                 }
     42                 else {
     43                     int ra = s - p.a;
     44                     int rb = n - p.b;
     45                     int rc = m - p.c;
     46                     int step = v[p.a][p.b][p.c] + 1;
     47                     if (ra > 0) {
     48                         int tmp = min(ra, p.b);
     49                         int at = p.a + tmp;
     50                         int bt = p.b - tmp;
     51                         int ct = p.c;
     52                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
     53                             if (tmp != 0) {
     54                                 que.push(State(at, bt, ct));
     55                                 v[at][bt][ct] = step;
     56                             }
     57                         }
     58 
     59                         tmp = min(ra, p.c);
     60                         at = p.a + tmp;
     61                         bt = p.b;
     62                         ct = p.c - tmp;
     63                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
     64                             if (tmp != 0) {
     65                                 que.push(State(at, bt, ct));
     66                                 v[at][bt][ct] = step;
     67                             }
     68                         }
     69                         
     70                     }
     71                     if (rb > 0) {
     72                         int tmp = min(rb, p.a);
     73                         int at = p.a - tmp;
     74                         int bt = p.b + tmp;
     75                         int ct = p.c;
     76                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
     77                             if (tmp != 0) {
     78                                 que.push(State(at, bt, ct));
     79                                 v[at][bt][ct] = step;
     80                             }
     81                         }
     82 
     83                         tmp = min(rb, p.c);
     84                         at = p.a;
     85                         bt = p.b + tmp;
     86                         ct = p.c - tmp;
     87                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
     88                             if (tmp != 0) {
     89                                 que.push(State(at, bt, ct));
     90                                 v[at][bt][ct] = step;
     91                             }
     92                         }
     93                     }
     94                     if (rc > 0) {
     95                         int tmp = min(rc, p.a);
     96                         int at = p.a - tmp;
     97                         int bt = p.b ;
     98                         int ct = p.c + tmp;
     99                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
    100                             if (tmp != 0) {
    101                                 que.push(State(at, bt, ct));
    102                                 v[at][bt][ct] = step;
    103                             }
    104                         }
    105 
    106                         tmp = min(rc, p.b);
    107                         at = p.a;
    108                         bt = p.b - tmp;
    109                         ct = p.c + tmp;
    110                         if (v[at][bt][ct] == -1 || step < v[at][bt][ct]) {
    111                             if (tmp != 0) {
    112                                 que.push(State(at, bt, ct));
    113                                 v[at][bt][ct] = step;
    114                             }
    115                         }
    116                     }//if(rc)
    117                 }//else
    118             }//while(queue)
    119             if (ans == -1) {
    120                 puts("NO");
    121             }
    122             else {
    123                 printf("%d
    ", ans);
    124             }
    125             
    126         }//else s is even
    127     }//while(scanf)
    128     return 0;
    129 }
  • 相关阅读:
    使用redis,zookeeper实现分布式锁
    基于线程池的多线程售票demo(原创)
    springboot全局异常处理
    IDEA2017.3.4破解方式及lombok图文配置详解
    LeetCode 120——三角形最小路径和
    LeetCode 1——两数之和
    LeetCode 445——两数相加 II
    在本地电脑使用远程服务器的图形界面——包括 MATLAB、PyCharm 等各种软件
    LeetCode 141——环形链表
    LeetCode 142——环形链表 II
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5874420.html
Copyright © 2020-2023  润新知