小 K 又在做白日梦了。他进入到他的幻想中,发现他打下了一片江山。
题目描述
小 K 打下的江山一共有 �n 个城市,城市 �i 和城市 �+1i+1 有一条双向高速公路连接,走这条路要耗费时间 ��ai。
小 K 为了关心人民生活,决定定期进行走访。他每一次会从 11 号城市到 �n 号城市并在经过的城市进行访问。其中终点必须为城市 �n。
不仅如此,他还有一个传送器,传送半径为 �k,也就是可以传送到 �−�i−k 和 �+�i+k。如果目标城市编号小于 11 则为 11,大于 �n 则为 �n。
但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快的完成访问,于是就想问交通部部长您最快的时间是多少。
注意:他可以不访问所有的城市,使用传送器不耗费时间。
输入格式
两行,第一行 �,�n,k。
第二行 �−1n−1 个整数,第 �i 个表示��ai。
输出格式
一个整数,表示答案。
#include <stdio.h>
#define N 1000005
typedef long long ll;
ll a[N], x, res = 0;
int main() {
ll n, k;
scanf("%lld %lld", &n, &k);
a[0] = 0;
for (ll i = 1; i < n; ++i) {
scanf("%lld", &x);
a[i] = a[i - 1] + x;
if (i >= k) {
res = (res > (a[i] - a[i - k])) ? res : (a[i] - a[i - k]);
} else {
res = (res > a[i]) ? res : a[i];
}
}
printf("%lld\n", a[n - 1] - res);
return 0;
}
或者
#include <stdio.h>
#define N 1000005
typedef long long ll;
ll a[N], x;
int main() {
ll n, k, res = 0;
scanf("%lld %lld", &n, &k);
a[0] = 0;
for (int i = 1; i < n; i++) {
scanf("%lld", &x);
a[i] = a[i - 1] + x;
int j = i - k < 0 ? 0 : i - k;
res = (res > (a[i] - a[j])) ? res : (a[i] - a[j]);
}
printf("%lld\n", a[n - 1] - res);
return 0;
}