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;
        }

 

转载于:https://www.cnblogs.com/fuqia/p/9537948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值