我是靠谱客的博主 潇洒雨,最近开发中收集的这篇文章主要介绍前缀和的应用(光骓者的荣耀),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

小 K 打下的江山一共有 n 个城市,城市 i 和城市 i+1有一条双向高速公路连接,走这条路要耗费时间 ai​。

小 K 为了关心人民生活,决定定期进行走访。他每一次会从 1 号城市到 n 号城市并在经过的城市进行访问。其中终点必须为城市 n。

不仅如此,他还有一个传送器,传送半径为 k,也就是可以传送到i−k 和 i+k。如果目标城市编号小于 1 则为 1,大于 n 则为 n。

但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快的完成访问,于是就想问交通部部长您最快的时间是多少。

注意:他可以不访问所有的城市,使用传送器不耗费时间

输入格式

两行,第一行 n,k。

第二行 n-1 个整数,第 i 个表示ai​。

输出格式

一个整数,表示答案。

这个题目是一个简单的前缀和的应用,关键点在于怎么最大化的利用传送器来节省时间。思路就是利用前缀和做差从而找到传送器可以传送的最远距离,最后答案就是不用传送器的时间减去传送器节省的时间即可。

#include<iostream>
using namespace std;
#define N 1000100
#define ll long long
ll n,k,h[N];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<n;i++) cin>>h[i];
    for(int i=1;i<n;i++) h[i]=h[i]+h[i-1];
    ll sum=0;
    for(int i=0;i+k<n;i++)//注意此处细节,i并未从1开始,因为i从1开始会导致我们少算从第一个城市直接使用传送器的情况。这个跟前缀和的性质有关(h[i]-h[j]所求的是j+1到i的距离)
        sum=max(sum,h[i+k]-h[i]);
    cout<<h[n-1]-sum;
    return 0;
}

最后

以上就是潇洒雨为你收集整理的前缀和的应用(光骓者的荣耀)的全部内容,希望文章能够帮你解决前缀和的应用(光骓者的荣耀)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部