zoukankan      html  css  js  c++  java
  • Uva 11054 Wine trading in Gergovia

     一条街道上都是买酒与卖酒的人家,每个住户都有一个需求量,正数代表售卖这个数目的酒,负数代表需要买这个数目的酒,每次两个住户进行交易都有一个路费

    等于交易量乘以两个住户相隔的距离,要求你设计一个方法使得总的路费最小且每个住户的需要都被满足(题目保证总需求与总售卖相等)

    联系生活很容易想到这样的请况,在生活中有的人需要借钱有的人需要存钱,那么他们的最简选择是什么?银行。

    可以这样假设,每个人都与左边的人交易,不管他是要售卖还是要购买,左边的这个人完全可以充当银行的角色(同时它也记录了交易数额),这样到了最后,每个人都充当了一个银行的角色,把它们所记录的数额相加起来就是最小路费(记住不管正负都是交易过的表现,要转化为正数)。

    #include <iostream>
    #include <cmath>
    using namespace std;
    int a[100000+10];
    int main()
    {
        int n;
        while(cin>>n&&n)
        {
            for(int i=0;i<n;i++)
            {
                cin>>a[i];
            }
            for(int i=0;i<n;i++)
            {
                a[i+1]=a[i+1]+a[i]; //往左边借酒
            }
            long long sum=0;
            for(int i=0;i<n;i++)
            {
                sum+=abs(a[i]);
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    View Code

     当然,也可以让右边的人充当银行的身份,不过银行一旦借出,就不能再变记录的数值,相当于他已经全部借出,无剩余款项

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int a[100010];
    int main()
    {
        int n;
        while(cin>>n&&n)
        {
         long long ans=0;
         for(int i=0;i<n;i++) cin>>a[i];
         for(int i=n-2;i>=0;i--)
         {
             a[i]+=a[i+1];
             ans+=abs(a[i+1]);
         }
         cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    leecode 91. 解码方法
    leecode 166. 分数到小数
    剑指 Offer 31. 栈的压入、弹出序列
    leecode 386. 字典序排数
    LeetCode 311 稀疏矩阵的乘法
    leecode 89. 格雷编码
    leecode 79. 单词搜索
    leecode 207. 课程表
    QT -- 解决:Error: Could not decode "*.cpp" with "UTF-8"
    VS+QT -- 没有PRO文件的问题
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4924301.html
Copyright © 2011-2022 走看看