题目链接:P3406 海底高铁 - 洛谷
题目:
接题思路:
要求求出买卡和买票的哪个花费最低,我们可以求出每个路段要经过的次数,最后根据路段经过的次数计算总价格,进行比较。
要求出每个路段经过的总次数,我们利用差分 + 前缀和求出每个路段的总次数就可以了
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int n,m;
LL d[N],a[N],b[N],c[N],sum=0;
int main(){
cin>>n>>m;
int bf,af,maxn,minn;
cin>>bf;
for(int i=2; i<=m; i++){
cin>>af;
maxn = max(af, bf);
minn = min(af, bf);
//因为第i站到第i+1站需要购买i站的票,所以再进行差分时,在min_number处++,在max_number处--
d[minn]++;
d[maxn]--;
bf = af;
}
for(int i=1; i<n; i++){
cin>>a[i]>>b[i]>>c[i];
}
//进行前缀和求出每段路经过的次数
for(int i=1; i<n; i++){
d[i] += d[i-1];
//进行比较累加求出最小值
sum += min(d[i]*a[i], c[i]+d[i]*b[i]);
}
cout<<sum;
return 0;
}