思路:
记录每段铁路的通过次数,计算每段铁路的俩种票价,用min函数取最小值累加得结果。
#include <iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int p[m],a[n],b[n],c[n],tj[n];
memset(tj,0,sizeof(tj));
cin>>p[0];
for(int i=1;i<=n;i++)
{
cin>>p[i];
if(p[0]>p[i])
{
for(int j=p[i];j<p[0];j++)
{
tj[j]++;
}
p[0]=p[i];
}
else
{
for(int j=p[0];j<p[i];j++)
{
tj[j]++;
}
p[0]=p[i];
}
}
for(int i=1;i<n;i++)
{
cin>>a[i]>>b[i]>>c[i];
}
int zqs=0;
for(int i=1;i<=n-1;i++)
{
zqs=zqs+min(tj[i]*a[i],tj[i]*b[i]+c[i]);
}
cout<<zqs<<endl;
return 0;
}
优化代码
#include <iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int p[100001],a[100001],b[100001],c[100001],tj[100001];
memset(tj,0,sizeof(tj));
cin>>p[0];
for(int i=1;i<=n;i++)
{
cin>>p[i];
}
int l,r;
for(int i=0;i<n;i++)
{
if(p[i]>p[i+1])
{
l=p[i+1];
r=p[i];
}
else
{
l=p[i];
r=p[i+1];
}
tj[l]++;
tj[r]--;
}
for(int i=0;i<n;i++)
{
tj[i]=tj[i]+tj[i-1];
}
for(int i=1;i<n;i++)
{
cin>>a[i]>>b[i]>>c[i];
}
int zqs=0;
for(int i=1;i<=n-1;i++)
{
zqs=zqs+min(tj[i]*a[i],(tj[i]*b[i]+c[i]));
}
cout<<zqs<<endl;
return 0;
}