题解:P15705 [2018 KAIST RUN Spring] Zigzag

很有趣的一道题,尝试使用滑动窗口的思想。

\(start\) 标记当前有效子段的起始位置,\(end\) 遍历序列作为子段终点。当 \(end\) 位置导致连续三个元素单调时,说明当前子段不符合要求,将起点更新为 \(end-1\);若未出现连续单调的三个元素,则更新最长有效子段的长度。记录的最长长度即为所求。

正确代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5000 + 5;
int n, a[N];
signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int ans = 2;
    int start = 1;
    for (int end = 1; end <= n; end++) {
        if ((end - start + 1) >= 3 && ((a[end - 2] <= a[end - 1] && a[end - 1] <= a[end]) || (a[end - 2] >= a[end - 1] && a[end - 1] >= a[end]))) {
            start = end - 1;
        }
        else {
            ans = max(ans, end - start + 1);
        }
    }
    cout << ans << endl;
    return 0;
}
posted @ 2026-03-12 13:31  Python_enjoy  阅读(1)  评论(0)    收藏  举报