测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A17021. 突击期的最大里程

填空题 中等

题目描述

突击期的最大里程

题目描述

长征途中,为了在保存红军体力的同时加快战略转移,指挥部决定设立一个为期 W 天的“战略突击期”。

由于翻雪山、过草地地形复杂,完全要求每天匀速行军是不现实的。指挥部制定了严格的评估标准:在这连续的 W 天内,任何相邻两天的行军里程差的绝对值都不能超过 D 公里。如果存在相邻两天的差值严格大于 D,则会发生“剧烈颠簸”,该 W 天的突击期将被视为不合格。

请在给定的 N 天行军记录中,找出所有合格的“战略突击期”,并计算在这些合格的突击期中,这 W 天的行军总里程最大是多少。如果没有找到任何一个合格的突击期,则输出 -1。

输入描述

第一行包含三个正整数 N, W, D,分别表示总记录天数、突击期的天数要求、以及相邻两天的最大允许里程差。

第二行包含 N 个非负整数 a1, a2, ..., aN,表示这 N 天里每天的行军里程。

输出描述

输出一个整数,表示在所有合格的“战略突击期”中,这 W 天的行军总里程的最大值。如果没有合格的突击期,输出 -1。

样例输入

7 3 2
10 11 10 15 16 14 20

样例输出

45

参考答案

#include <bits/stdc++.h> using namespace std; long long a[1000005]; int main() { int n, w; long long d; cin >> n >> w >> d; for (int i = 1; i <= n; i++) cin >> a[i]; if (w == 1) { long long ans = a[1]; for (int i = 2; i <= n; i++) ans = max(ans, a[i]); cout << ans; return 0; } long long sum = 0, ans = -1; int bad = 0; for (int i = 1; i <= w; i++) sum += a[i]; for (int i = 2; i <= w; i++) if (abs(a[i] - a[i - 1]) > d) bad++; if (bad == 0) ans = sum; for (int l = 2; l + w - 1 <= n; l++) { int r = l + w - 1; sum = sum - a[l - 1] + a[r]; if (abs(a[l] - a[l - 1]) > d) bad--; if (abs(a[r] - a[r - 1]) > d) bad++; if (bad == 0) ans = max(ans, sum); } cout << ans; return 0; }

答案解析

1. 每个连续 W 天就是一个窗口。

2. 用 sum 记录当前窗口的总里程。

3. 用 bad 记录当前窗口中有多少对相邻天数不合格。

4. 当窗口右移时,减去离开的天数,加上新进入的天数,同时更新相邻差是否合格。

5. 如果 bad == 0,说明当前窗口合格,用它的总和更新答案。

上一题 下一题