ZOJ-4107 Singing Everywhere 2019浙江省省赛

题目链接

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);
	}
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值