大概被这道题卡了好久,还是太菜了。😊😒🤣😁🤔😃
题目背景
大东亚海底隧道连接着厦门、新北、博艾、那霸、鹿儿岛等城市,横穿东海,耗资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;
}
来源:CSDN
作者:Yun102400
链接:https://blog.csdn.net/qq_42188312/article/details/104024691