传送门https://codeforces.com/contest/1635/problem/B
在这个问题中,a[i] 只是否符合条件取决于a[i-1]和a[i+1],但a[i-1]改变并不会影响后面的区间。要注意的是a[i+1]他会影响a[i+2]。如果a[i+1]<a[i+2]有可能是a[i+2]也不符合条件,所以a[i+1]=max(a[i],a[i+2])——这就是贪心部分。
AC代码如下:
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<cmath>
#include<string>
#include<string.h>
//priority_q
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define int long long
//s.find 未找到返回 string::npos
using namespace std;
int mp[200005];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 0;
cin >> t;
while (t--)
{
int n; cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> mp[i];
}
int last = mp[1];
for (int i = 2; i < n; i++)
{
int a = mp[i - 1];
int b = mp[i + 1];
if (mp[i] > a && mp[i] > b)
{
ans++;
mp[i+1] = max(mp[i],mp[i+2]);
}
}
cout << ans << endl;
for (int i = 1; i <= n; i++)
{
cout << mp[i] << " ";
}
cout << endl;
}
}