zoukankan      html  css  js  c++  java
  • 洛谷 P3406 海底高铁

    题目背景

     

    题目描述

    该铁路经过 N 个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第 ii 段铁路连接了城市 i 和城市 i+1(1i<N)。如果搭乘的比较远,需要购买多张车票。第 i 段铁路购买纸质单程票需要 Ai 博艾元。

    虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。对于第 i 段铁路,需要花Ci 博艾元的工本费购买一张 IC 卡,然后乘坐这段铁路一次就只要扣 Bi(Bi<Ai) 元。IC 卡可以提前购买,有钱就可以从网上买得到,而不需要亲自去对应的城市购买。工本费不能退,也不能购买车票。每张卡都可以充值任意数额。对于第 ii 段铁路的 IC 卡,无法乘坐别的铁路的车。

    Uim 现在需要出差,要去 M 个城市,从城市 P1 出发分别按照 P1,P2,P3,,PM 的顺序访问各个城市,可能会多次访问一个城市,且相邻访问的城市位置不一定相邻,而且不会是同一个城市。

    现在他希望知道,出差结束后,至少会花掉多少的钱,包括购买纸质车票、买卡和充值的总费用。

    输入格式

    第一行两个整数,N,M。

    接下来一行,M 个数字,表示 Pi

    接下来 N1 行,表示第 i 段铁路的Ai,Bi,Ci

    输出格式

    一个整数,表示最少花费

    输入输出样例

    输入 #1
    9 10
    3 1 4 1 5 9 2 6 5 3
    200 100 50
    300 299 100
    500 200 500
    345 234 123
    100 50 100
    600 100 1
    450 400 80
    2 1 10
    输出 #1
    6394

    说明/提示

    22 到 33 以及 88 到 99 买票,其余买卡。

    对于 30% 数据 M=2M=2。

    对于另外 30% 数据 1000,N1000M1000。

    对于 100% 的数据 M,N105Ai,Bi,Ci105。

    分析

    考察差分左右端点的转化

    代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    
    //直接模拟复杂度会到n*m,考虑差分 
    const int N=1e5+5;
    int n,m;
    int book[N+5];//差分每段铁路
    int t[N+5];//统计每段铁路经过的次数 
    
    signed main()
    {
        cin>>n>>m;
        
        int last_city;
        cin>>last_city;
        
        for(int i=2;i<=m;i++)//差分时左端点小,右端点大 
        {
            int city;
            cin>>city;
            if(last_city>city)//往回走
            {
                book[last_city]--;
                book[city]++;
            } 
            else if(last_city<city)//往前走 
            {
                book[last_city]++;
                book[city]--;
            }
            last_city=city;
        }
        
        int sum=0; 
        for(int i=1;i<n;i++)
        {
            sum+=book[i];//统计差分结果
            t[i]=sum;
        } 
        
        int ans=0;
        for(int i=1;i<=n-1;i++)
        {
            int a,b,c;//原价,优惠价,车票
            cin>>a>>b>>c;
            if(t[i]!=0)
            {
                ans+=min(a*t[i],c+b*t[i]);
            }
        }
        cout<<ans<<endl;
        return 0;
    } 
  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/15660011.html
Copyright © 2011-2022 走看看