洛谷:P3406 海底高铁(前缀和与差分,普及/提高- )

题目:

在这里插入图片描述

分析:首先统计经过每一站的数量,结果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];//从1-2  为A【1】   从2-1  为A【1】 
 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];//从1-2  为A【1】   从2-1  为A【1】 
 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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/108532165