P3406 海底高铁

久未见 提交于 2020-01-17 23:54:53

大概被这道题卡了好久,还是太菜了。😊😒🤣😁🤔😃

题目背景

大东亚海底隧道连接着厦门、新北、博艾、那霸、鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成。凭借该隧道,从厦门可以乘坐火车直达台湾、博艾和日本,全程只需要4个小时。

题目描述

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

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

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

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

输入格式

第一行两个整数,N,M。
接下来一行,M个数字,表示Pi
接下来N-1行,表示第i段铁路的Ai,Bi,Ci

输出格式

一个整数,表示最少花费

输入输出样例

在这里插入图片描述
在接触到前缀和之前,一直无从下手。到现在也算是有了点思路。
题目是让求 一个旅行家按一定顺序旅行,求其最少费用。我们容易想到的就是,1.求出每段铁路,旅行家经过的次数m
2.比较每段铁路单独买票和购IC卡买票的费用(IC卡只要买一次),也就是求min(mAi,mBi+Ci),求出最小值加入到总费用中。(局部求最小费用,这也是贪心算法吧,我竟然又掌握了一种高级算法 嘻嘻😃)

但是吧 每段铁路经过的次数卡了我好久,就是没有头绪。
可以建个数组来统计每段铁路的次数,初始值全为0

数组 0 1 2 3 4 5 6 7 8 9
val(经过的次数) 0 0 0 0 0 0 0 0 0 0

就拿样例来说吧
3 1 4 1 5 9 2 6 5 3
从3 到1 也就是从1 到 3 对于铁路来说 一段(1-2) 二段(2-3) 要++
对于其差分数组,假设数组名为c 就要让c[1]++,c[3]–;
然后再对1到4,4到1。。。作同样处理,直至最后一个节点
最后附上AC代码、

#include<bits/stdc++.h>
using namespace std;
int main(){
    int m,n;
    long long x,y,a,b,c,ans;
    long long  p[100001],val[100001];
    cin>>n>>m;
    for (int i=1;i<=m;++i) cin>>p[i];
    memset(val,0,sizeof(val));
    for (int i=1;i<m;++i){
        x=max(p[i],p[i+1]);
        y=min(p[i],p[i+1]);
        val[y]++;
        val[x]--;
    }
    for (int i=1;i<=n;++i)val[i]+=val[i-1];
    for (int i=1;i<n;++i){
        cin>>a>>b>>c;
        ans+=min(a*val[i],b*val[i]+c);
    }
    cout<<ans;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!