生活会辜负努力的人,但不会辜负一直努力的人

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  每个自行车车站的最大容量为一个偶数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;
        }

 

posted on 2018-08-26 17:27  何许亻也  阅读(216)  评论(0编辑  收藏  举报