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;
            }
  • 相关阅读:
    mysql6.0免安装配置
    SQL2005安装时“性能监视器计数器要求(错误)”解决办法
    Centos 下解压和压缩rar文件
    MyEclipse插件介绍与下载
    算法设计之递归法
    Centos5.2 下安装MySQL+Tomcat6 及设置自启动
    科学用电脑
    浅谈Linux的安全设置
    JAVA程序员之路
    CentOS 5.5 挂载Windows NTFS 文件系统
  • 原文地址:https://www.cnblogs.com/fuqia/p/9537948.html
Copyright © 2011-2022 走看看