光骓者的荣耀
小 K 打下的江山一共有 $n$ 个城市,城市 $i$ 和城市 $i+1$ 有一条双向高速公路连接,走这条路要耗费时间 $a_i$。小 K 为了关心人民生活,决定定期进行走访。他每一次会从 $1$ 号城市到 $n$ 号城市并在经过的城市进行访问。其中终点必须为城市 $n$。
不仅如此,他还有一个传送器,传送半径为 $k$,也就是说可以传送到 $i-k$ 和 $i+k$。如果目标城市编号小于 $1$ 则为 $1$,大于 $n$ 则为 $n$。
但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快地完成访问,于是就想问交通部部长您最快的时间是多少。
注意: 他可以不访问所有的城市,使用传送器不耗费时间。
输入格式
- 两行:第一行包含两个整数 $n, k$。
- 第二行:包含 $n-1$ 个整数,第 $i$ 个整数表示 $a_i$(即城市 $i$ 到 $i+1$ 之间的耗时)。
输出格式
- 输出一个整数,表示从 $1$ 号城市到 $n$ 号城市的最短时间。
我们想要尽可能的少走,传送的距离尽可能的多
用一个数组存储相邻两个城市之间的距离然后计算这个数组的前缀和,计算arr[i+k]-arr[i]的最大值,就可以找到传送的最大距离,以及对应的传送点i
用总距离减去这个传送的最大距离就可以得到最短路程
using namespace std;
int main(){
int n,k,maxdistance=0,maxstation=0;
cin>>n>>k;
if(k>=n-1)
cout<<0;
else{
int prefix[n];
prefix[0]=0;
for(int i=1;i<n;i++)
cin>>prefix[i];
for(int i=2;i<n;i++)
prefix[i]+=prefix[i-1];
for(int i=0;i<n-k;i++)
{
if(prefix[i+k]-prefix[i]>maxdistance)
{
maxdistance=prefix[i+k]-prefix[i];
maxstation=i;
}
}
cout<<maxstation<<endl<<prefix[n-1]-maxdistance;
}
}
