zoukankan      html  css  js  c++  java
  • 5、(★)自行车站的“完美状态”

      每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车展容量是满的或者空的(问题车站),控制中心(处于结点0处)就会携带或者从路上收集一定数量的自行车前往该车站,一路上会让所有的车展沿途都达到完美。

    注意:沿途所有车站的调整过程必须在前往问题车站的过程中就调整完毕,带回时不再调整。

    根据Dijkstra+DFS得到最短路径时(可能有多条),那么对于特定的一条路径来说,计算最少的携带数和最终的带回数(当携带数最少时,最终的带回数是一定的)??

    思路:可以把问题转化为另一个更为熟悉的问题,还钱问题。所谓最少携带数即还钱时,需要多少钱,就带多少钱。

    假设你借了一部分人的钱,另外也有其他人借了你的钱,但是具体的数值你不知道。接下来要确定的顺序去还钱或收钱计算你最少需要带多少钱,最终剩余多少钱。

    注意:不可以收回下一家的钱去还上几家欠的钱。因为你每到一家,必须还钱或收钱,必须有一个结果。

    • 初始化变量send=0,为需要从家里带的钱数,collect=0为收回的钱
    • 当前家如果欠你钱的话,collect+=欠的钱,send不用更新。
    • 你如果欠当前家的钱的话,比较前几家收回的钱和欠的钱的大小,如果够用的话,就不用在家带了,否则在家带。

    可以想象,每一家和你自己的家都有一条直通的路,不用经过别家。如果你到了一家发现钱不够的话,就回到家里拿。如果你收回钱了,为了少跑路,直接奔向下一家。

    int send = 0, collect = 0;
            for (int i = tempPath.size()-2;i>=0;i--) {
                int id = tempPath[i];
                if (weight[id] < 0) {
    
                    if (collect < abs(weight[id])) {
                        send += abs(weight[id]) - collect;
                        collect = 0;
                    }
                    else {
                        collect -= abs(weight[id]);
                    }
                }
                else {
                    collect += weight[id];
                }
            }
    
            if (send < minSend) {
                minSend = send;
                minCollect = collect;
                path = tempPath;
            }
            else if (send == minSend && collect < minCollect) {
                minCollect = collect;
                path = tempPath;
            }
  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/fuqia/p/9537948.html
Copyright © 2011-2022 走看看