CF1467B Hills And Valleys

修改一座山可能同时改变其两侧山的类型。贪心地考虑,要么是修改成其左侧山的高度要么是修改成其右侧山的高度,这样能够在使得当前山不成为山峰和山谷的同时让两侧的山尽可能不成为山峰和山谷。

时间复杂度 (O(sum n))

code:

#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
",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*/
原文地址:https://www.cnblogs.com/May-2nd/p/14361568.html