RT,一个跟题解长得不太一样的思路但是 WA 了,CF上数据包过大看不了,从评测信息上看答案为 1,我的输出为 0……
思路大概就是枚举每一个修改点,看看它、它左边、它右边是不是山峰或山谷,然后根据数量更新答案。
代码:
#include<bits/stdc++.h>
#define ll long long
#define back return
#define ri register int
#define ull unsigned long long
using namespace std;
ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
back x*f;
}
int t,n,a[300005];
bool flag[300005];
int main()
{
t=read();
while(t--)
{
int sum=0,ans;
memset(flag,0,sizeof(flag));
n=read();
for(ri i=1;i<=n;i++)
a[i]=read();
for(ri i=2;i<=n-1;i++)
if((a[i]>a[i+1]&&a[i]>a[i-1])||(a[i]<a[i+1]&&a[i]<a[i-1]))
flag[i]=1,sum++;
ans=sum;
for(ri i=2;i<=n-1;i++)
{
if(flag[i+1]+flag[i-1]+flag[i]==3)
ans=min(ans,sum-3);
if(flag[i+1]+flag[i-1]+flag[i]==2)
ans=min(ans,sum-2);
if(flag[i+1]+flag[i-1]+flag[i]==1)
ans=min(ans,sum-1);
if(flag[i+1]+flag[i-1]+flag[i]==0)
ans=min(ans,sum);
}
cout<<ans<<"\n";
}
back 0;
}