题目链接在此:海底高铁 - 洛谷
分析题意,首先,若要从1到达5城市,只能由1-2-3-4-5这样的方式乘坐,而从5到3也只能5-4-3来乘坐,这也就代表着,每一次到达一个城市都得经历他们路上的每一个城市。
而我们更进一步分析来看,这也就意味着每一次访问一个城市都得把起点和终点上的所有城市值加上一。而这个次数值一定是和我们的选择有关的,这一点想必不用多说。
而我们每一次选择应该怎么选择呢?
买一张c的卡,享受b的价钱,但有一些数据他是a小于后面的值的,或者有时只经过一次时用a更省钱。
这时,我们想一下该用什么样的方式来让这些价钱最少呢?
答案也不难想到,利用贪心策略,让每一次每一个城市的价钱都最小,即次数*价钱的最小值,代码也就不难想到了。
此时,就有伙伴要问了,为什么要用到一个前缀和差分思想呢?
很简单,我们从上述题意中分析到要让某个区间内的数字全部加上,减上某个值,那么来吧!这不是差分吗?
好,详细代码如下,我已经尽量将注释标注完全。
#include<iostream>
using namespace std;
//差分加上贪心策略。
int n,m,x1,x2,a,b,c,k[100010];
long long sum,ans;
int main()
{
cin>>n>>m;
if(m>0)cin>>x1;//理解差分思想的关键就是在一段区间内的所有值要加上一个确定的数字。
for(int i=2;i<=m;i++)
{
cin>>x2;//由于每次更新只是这一个节点和上一个节点之间的关系,所以只用输入一个x2,就可以用来让两个城市间所有经过的城市+1。
if(x2>x1) {
k[x1]++;
k[x2]--;}
else{
k[x1]--;