Hills And Valleys CodeForces-1467B

Hills And Valleys CodeForces-1467B

題名:

一連の数値を変更して、ピーク(山、谷)の数を最小限に抑えます

回答:

数値の変更は、最大で左右の数値にのみ影響します。減らすことができるピークの数は、1、2
、および3です。現在の位置iの場合、a [i]を左より小さく変更すると、右側ケースは左右よりも大きいです。真ん中のケースは左側と右側のケースと同じです。上記のすべての場合で、最大の温度
取り、合計量から温度を差し引きます。

コード:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
#define int long long
int t, n, a[maxn];
int judge(int i) {
    
    
    if (i >= 2 && i <= n - 1) {
    
    
        if (a[i] > a[i + 1] && a[i] > a[i - 1]) return 1;//山峰 
        if (a[i] < a[i + 1] && a[i] < a[i - 1]) return 1;//山谷 
    }
    return 0;
}
signed main() {
    
    
    cin >> t;
    while (t--) {
    
    
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        int ans = 0, temp = 0;
        for (int i = 2; i <= n - 1; i++)
            if (judge(i)) ans++;
        for (int i = 1; i <= n; i++) {
    
    
            int now = judge(i - 1) + judge(i + 1) + judge(i);
			int last = 1e9;
			int f = a[i];
            a[i] = min(a[i - 1], a[i + 1]) - 1;  //比小的小
            last = min(last, judge(i - 1) + judge(i + 1) + judge(i));
            a[i] = max(a[i - 1], a[i + 1]) + 1;  //比大的大
            last = min(last, judge(i - 1) + judge(i + 1) + judge(i));
            a[i] = min(a[i - 1], a[i + 1]) + 1;  //位于中间
            last = min(last, judge(i - 1) + judge(i + 1) + judge(i));
            a[i] = a[i - 1];  //相等
            last = min(last, judge(i - 1) + judge(i + 1) + judge(i));
            a[i] = a[i + 1];  //相等
            last = min(last, judge(i - 1) + judge(i + 1) + judge(i));
            temp = max(temp, now - last);
            a[i] = f;
        }
        cout << ans - temp << endl;
    }
}

おすすめ

転載: blog.csdn.net/qq_35975367/article/details/114096260