标签:namespace ace std while 复杂度 时间 val getc lan
修改一座山可能同时改变其两侧山的类型。贪心地考虑,要么是修改成其左侧山的高度要么是修改成其右侧山的高度,这样能够在使得当前山不成为山峰和山谷的同时让两侧的山尽可能不成为山峰和山谷。
时间复杂度 \(O\left(\sum n\right)\)。
#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define Max(x,y)((x)>(y)?x:y)
#define For(i,x,y)for(i=x;i<=(y);i++)
int a[N],hill[N];
int read()
{
int A;
bool K;
char C;
C=A=K=0;
while(C<‘0‘||C>‘9‘)K|=C==‘-‘,C=getchar();
while(C>‘/‘&&C<‘:‘)A=(A<<3)+(A<<1)+(C^48),C=getchar();
return(K?-A:A);
}
int main()
{
int t,ans,mx,i,n;
t=read();
while(t--)
{
n=read();
ans=mx=0;
For(i,1,n)a[i]=read(),hill[i]=0;
For(i,2,n-1)
{
if(a[i]>a[i-1]&&a[i]>a[i+1])hill[i]=1,ans++;
if(a[i]<a[i-1]&&a[i]<a[i+1])hill[i]=-1,ans++;
}
For(i,2,n-1)
{
mx=Max(mx,(hill[i-1]!=0)+(hill[i]!=0)+(hill[i+1]!=0)-(i!=n-1&&(a[i+1]>a[i-1]&&a[i+1]>a[i+2]||a[i+1]<a[i-1]&&a[i+1]<a[i+2])));
mx=Max(mx,(hill[i-1]!=0)+(hill[i]!=0)+(hill[i+1]!=0)-(i!=2&&(a[i-1]>a[i+1]&&a[i-1]>a[i-2]||a[i-1]<a[i+1]&&a[i-1]<a[i-2])));
}
printf("%d\n",ans-mx);
}
return 0;
}
/*3
7
1 5 7 8 3 2 4
7
1 4 2 3 4 2 1
8
4 3 2 1 4 3 2 6*/
标签:namespace ace std while 复杂度 时间 val getc lan
原文地址:https://www.cnblogs.com/May-2nd/p/14361568.html