1. 程式人生 > 其它 >LuoguP5638 【CSGRound2】光騅者的榮耀 題解

LuoguP5638 【CSGRound2】光騅者的榮耀 題解

LuoguP5638 【CSGRound2】光騅者的榮耀 題解

感覺這次月賽的第二題比第一題還簡單,但是第一題思路還是比較明晰的。


這裡我們利用了字首和的思想,我們可以在邊輸入的時候邊處理字首和。

那麼這裡字首和有什麼用呢?我們可以發現,這道題目本質就是讓你找到長度為\(k\)的最大連續子段和。拿總長度減去這個最大連續子段和就是我們想要的答案啦!

程式碼實現的時候注意,Karry弄的非常良心的資料範圍,不開long long見祖宗!

好了,所以這道題目就做完了,下面奉上AC程式碼,不懂的可以參考一下:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
#define ll long long

ll n, k, a[1000007], s[1000007], tmp;

int main() {
	scanf("%lld%lld", &n, &k);
	for(ll i = 1; i < n; ++i) {
		scanf("%lld", &a[i]);
		s[i] = s[i - 1] + a[i];
	} 
	ll maxi = s[k];
	for(ll i = k + 2; i < n; ++i) {
		maxi = max(maxi, s[i] - s[i - k]);
	}
	printf("%lld", s[n - 1] - maxi);
	return 0;
}