题目链接
Sample Input
3
6
1 1 4 5 1 4
7
1 9 1 9 8 1 0
10
2 1 4 7 4 8 3 6 4 7
Sample Output
1
0
2
题意,给定一个序列,让你消除某个数,所得序列最高峰最少是多少
例如样例 1 1 4 5 1 4 无论如何消除一个数,最后结果都是1,
但是样例 1 9 1 9 8 1 0 只要把第三个数 1 消除,得到1 9 9 8 1 0,就没有最高峰了答案为0。
实际上直接暴力就行了,首先求出原本有多少个峰,然后每次模拟消除一个数,看最多能消除多少个,最后拿原本的减去消除最多的就可以了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+6;
long long a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
a[0]=99999999999;
a[n+1]=99999999999;//边界处理
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
long long sum=0;
for(int i=2; i<=n-1; i++)
{
if(a[i-1]<a[i]&&a[i]>a[i+1])
sum++;
}//sum代表原序列中有多少个峰
long long ansans=0;
for(int i=1; i<=n-1; i++)
{
long long ans=0;
long long ans1=0;
if(a[i-1]>a[i+1]&&a[i-1]>a[i-2])//ans代表消除之后
ans++;
if(a[i+1]>a[i-1]&&a[i+1]>a[i+2])
ans++;
if(a[i-1]>a[i-2]&&a[i-1]>a[i])//ans1代表消除之前
ans1++;
if(a[i+1]>a[i+2]&&a[i+1]>a[i])
ans1++;
if(a[i]>a[i-1]&&a[i]>a[i+1])
ans1++;
ansans=max(ansans,ans1-ans);//做差取最大
}
printf("%lld\n",sum-ansans);
}
}