题目:
分析:首先统计经过每一站的数量,结果T了:
#include<bits/stdc++.h>
using namespace std;
int A[100005];
int B[100005];
int C[100005];
int D[100005];
int cnt[100005];
int m,n;
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++) cin>>D[i];
for(int i=1;i<m;i++) cin>>A[i]>>B[i]>>C[i];
for(int i=1;i<n;i++)
{
if(D[i-1]<D[i])
{
for(int j=D[i-1];j<D[i];j++) cnt[j]++;
}
else{
for(int j=D[i];j<D[i-1];j++) cnt[j]++;
}
}
long long ans=0;
for(int i=1;i<m;i++)
{
ans+=min(cnt[i]*A[i],cnt[i]*B[i]+C[i]);
}
cout<<ans;
}
看到题解:开头结尾,突然想到自己在leetcode上做过类似的优化,自己再思考思考吧。
那个思路还在,很容易想到,开头加1,结尾或者结尾的下一个减一。
挺好!
#include<bits/stdc++.h>
using namespace std;
int A[100005];
int B[100005];
int C[100005];
int D[100005];
int cnt[100005];
int m,n;
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++) cin>>D[i];
for(int i=1;i<m;i++) cin>>A[i]>>B[i]>>C[i];
for(int i=1;i<n;i++)
{
if(D[i-1]<D[i])
{
cnt[D[i-1]]++;
cnt[D[i]]--;
}
else{
cnt[D[i-1]]--;
cnt[D[i]]++;
}
}
long long ans=0;
long long now=0;
for(int i=1;i<m;i++)
{
now+=cnt[i];
ans+=min(now*A[i],now*B[i]+C[i]);
}
cout<<ans;
}