CF1962EBinary Deque(题目中一定要注意的相对区间大小问题。)

 删除最少的数字,反向思考是什么?答案很简单就是让一个序列中的子序列满足最大这个属性。

我们很容易想到的是,求出一个值为s的子序列,由总长度减去这个子序列的长度就是我们最少删除掉的值。

  对于这种0,1计数达到某种条件的问题,我们还很容易想到通过某一个数组记录值为1的位置,这样的话我们就可以很容易得到两个1之间有着几个0。

  接下来,通过这样的方式我们更加容易地想到可以通过序列长度来判断这个序列是否有着值为s这么多。

  而对0的增加删除我们也可以通过这样的方式。

引申而出思考,我们记录了每一个具有某种关键性质点的相对位置,如果问题与这些相对距离有关,我们就可以通过这种方式来解决。

在记录相对坐标后,就可以通过这些相对坐标之间的距离,算出0的数量,1的数量,进而得到更大的区间长度。

#include<bits/stdc++.h>
using namespace std;
const int N=200050;
int a[N];
int b[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,s;
		cin>>n>>s;
		int cnt=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i])b[++cnt]=i;
		}
		if(cnt<s)
		{
			cout<<"-1"<<"\n";
			continue;
		}
		b[0]=0;
		b[cnt+1]=n+1;
	
		int ans=0;
		for(int l=1,r=s;r<=cnt;l++,r++)
		{
			int sum=b[r]-b[l]+1;
			sum+=(b[l]-b[l-1]-1);
			sum+=(b[r+1]-b[r]-1);
			ans=max(ans,sum);
		}
		cout<<n-ans<<"\n";

		
		
	}
	return 0;
}

最后,让我们来思考下,相对区间大小问题。

int sum=b[r]-b[l]+1

为什么加一?

b数组中存储着每一个1的坐标,通过两个坐标相减,比如5和3,5-3=2,而正确答案是3,所以我们需要加一。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值