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;
}