P5638 【CSGRound2】光骓者的荣耀 (前缀和)

时间:2022-07-28
本文章向大家介绍P5638 【CSGRound2】光骓者的荣耀 (前缀和),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题意描述

题目描述 小 K 打下的江山一共有n个城市,城市i和城市i+1之间有一条双向高速公路连接,走这条路要耗费时间ai。 小 K 为了关心人民生活,决定定期进行走访。他每一次会从1号城市到n号城市并在经过的城市进行访问。其中终点必须为城市n。 不仅如此,他还有一个传送器,传送半径为k,也就是可以传送到i−k和i+k。如果目标城市编号小于1则为11,大于n则为n。 但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快的完成访问,于是就想问交通部部长您最快的时间是多少。 注意:他可以不访问所有的城市,使用传送器不耗费时间 输入格式 两行,第一行n,k。 第二行n−1个整数,第i个表示ai 输出格式 一个整数,表示答案。

输入: 4 0 1 2 3 输出: 6 输入: 4 1 1 2 3 输出: 3

题意描述可能不清楚,具体的图是数据范围见原链接:洛谷

思路

这是洛谷的一道入门题…一道入门题都让我想了20分钟。由于传送器只能使用一次,所以我们要将传送器使用在距离最远的城市。需要注意的是,如果能够传送的城市范围大于城市的数目,那么最快输出0就可以。

AC代码

#include<iostream>
#include<algorithm>
#include<cmath>
#define IOS ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int INF=1e9+7;
ll a[maxn],s[maxn];
int n,k;
int main()
{
    IOS;
    cin>>n>>k;
    for(int i=1;i<=n-1;i++){
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }
    k--;
    if(k<0) cout<<s[n-1]<<endl;
    else if(k>=n-1) cout<<0<<endl;
    else{
        ll ma=-INF;
        for(int i=k+1;i<=n-1;i++){
            ma=max(ma,s[i]-s[i-k-1]);
        }
        cout<<s[n-1]-ma<<endl;
    }
	return 0;
}