• 洛谷 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;
    } 
  • 相关阅读:
    dotnetcharting 生成柱状图,饼图等统计图
    asp.net 前后台相互调用
    SQL基础和高级(语法格式)总结二
    自己动手JQuery插件开发
    SQL基础之创建数据库,表,架构
    SQL基础和高级(语法格式)总结一
    ado.net总结
    [Nescafé 26] 小猫爬山&&售货员的难题&&区间众数(随机化大法好)
    POJ2774 后缀自动机&后缀数组
    【方向学习】单片机
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/15660011.html
Copyright © 2020-2023  润新知