WA pretest3,求 hack
查看原帖
WA pretest3,求 hack
93266
断清秋楼主2021/10/19 14:29

RT,一个跟题解长得不太一样的思路但是 WA 了,CF上数据包过大看不了,从评测信息上看答案为 11,我的输出为 00……

思路大概就是枚举每一个修改点,看看它、它左边、它右边是不是山峰或山谷,然后根据数量更新答案。

代码:

#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;
}
2021/10/19 14:29
加载中...