题解 LGP9253 [PA 2022] Ornitolog 2

由 hycqwq 发布

Problem

给定一个序列,问最少要改几个数才能使该序列变为一大一小交错的"波浪形"。

Conditions

"波浪形"有两种可能:

Condition 1

1   3   5
 \ / \ /  ...
  2   4

即:第一个数是大数。

那么如果发现了一个不符合规律的数,如果应该是大数则设为 $+\infty$,否则(即应该是小数时)则设为 $-\infty$。

Condition 2

 2   4
/ \ / \  ...
1   3   5

即,第一个数是小数。

处理方法与另一种情况类似。

Solution

对这两种情况分别进行遍历更改统计即可。

另外有一个小技巧:因为两种情况正好相反,所以可以用一个布尔值来表示现在模拟的情况。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define elif else if
#define il inline

int n, a[50005], b[50005];

int slv(bool f)
{
    memcpy(a, b, sizeof(a));
    int cnt = 0;
    for (int i = 2; i <= n; i++)
        if (i % 2 == f)
        {
            if (a[i - 1] <= a[i])
                a[i] = -inf, cnt++;
        }
        else
        {
            if (a[i - 1] >= a[i])
                a[i] = inf, cnt++;
        }
    return cnt;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> b[i];
    cout << min(slv(true), slv(false)) << endl;
    return 0;
}

暂无评论

发表评论