![](https://img-blog.csdnimg.cn/img_convert/17e7e8fc1937530c41b39eb4168c5480.png)
![](https://img-blog.csdnimg.cn/img_convert/abd118ad069df026471c478cc8cd7643.png)
题意
本题题目是比较长的,大概的意思是有n座城市,然后小猿要去m个城市。在每一站,可以办卡一次性买x张车票,也可以一张一张买,不过办卡是需要钱的,问如何购买花的钱最少。
思路
输入n,m;n表示的是总共城市数,m表示的是要去的城市数。
宏定义一个数组,将每次要去的城市编号记录。
利用差分,计算每条路去的次数。我认为这里需要注意的一点是八个城市有七个路,因而我把1和2城市之间的路记为1。如果对差分不熟悉,可以去了解一下,我给大家提供一个基本的模板。
//差分:我所理解的就是当需要对一个数组的某n个区间的数加x或减x,这时为了速度的优化,用到差分。
//差分的基本模板是如果数组中本身不为0,那么首先要对数组进行一次差分,然后再对此数组中的某m个区间的数进行差分,最后得到结果。
# include <iostream>
using namespace std;
int a[100100],b[100100];
//主要模板
void chafen(int l,int r,int c)
{
b[l]=b[l]+c;
b[r+1]=b[r+1]-c;
}
int main ()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
//主要模板
for(int i=1;i<=n;i++) chafen(i,i,a[i]);
while(m--)
{
int l,r,c;cin>>l>>r>>c;
chafen(l,r,c);
}
for(int i=1;i<=n;i++) b[i]=b[i-1]+b[i];
for(int i=1;i<=n;i++) cout<<b[i]<<" ";
return 0;
}
求出每个路需要的次数之后,我是定义一个结构体,将每条路的三个变量输进去,然后进行哪种方案更便宜的比较,最后输出结果即可。
需要的注意的有几点:虽然题目中A,B,C给的数据范围是10的5次方,但是却需要定义为long long型,还有输出的总数也需要定义为long long型,然后就是差分模板,同时建议大家也学一下前缀和模板,给大家上代码。
源码
# include <iostream>
using namespace std;
int a[100100];int b[100100];
long long unsigned num=0;
//定义的结构体变量
struct xinxi
{
int q,w,e;
}arr[100100];
//利用差分计算每条路的次数
void insert(int l,int r)
{
if(l>r)
{
int g=l;l=r;r=g;
}
b[l]=b[l]+1;
b[r]=b[r]-1;
cout<<l<<" "<<r<<endl;
}
int main ()
{
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
//和上面的insert组成差分模板
for(int i=1;i<m;i++)
{
insert(a[i],a[i+1]);
}
for(int i=1;i<n;i++) b[i]=b[i-1]+b[i];
for(int i=1;i<n;i++)
cin>>arr[i].q>>arr[i].w>>arr[i].e;
for(int i=1;i<n;i++)
{
if(b[i]==0) continue;
if(arr[i].q*b[i]<(arr[i].w*b[i]+arr[i].e))
num=num+arr[i].q*b[i];
else num=num+arr[i].w*b[i]+arr[i].e;
}
cout<<num;
return 0;
}
23年年后第一次正式的写博客,祝大家23年次次AC。