3 条题解

  • 2
    @ 2024-11-18 13:56:09

    贴个二分代码,跑得比spq的O(N)做法快
    思路: 假设1的数量是cc。如果答案是xx,那么我们最多删除了xx个1,并且最多留下了xx个0。如果cx+1c \ge x+1,一定满足要求。因此,答案存在单调性,我们考虑对区间[0,c][0, c]使用二分。

    我们实现一个数组pospos,其中posipos_i是字符串中第ii个1的位置。在checkcheck函数中,我们枚举每个删完后剩下的区间,并判断其中0的个数是否x\le x
    核心代码:

    signed main()
    {
    	setIO();
    	string str; cin>>str;
    	vector<int> pos;
    	for(int i=0; i<str.size(); i++)
    		if(str[i]=='1')
    			pos.eb(i);
    	if(pos.empty() || pos.back()-pos.front()==pos.size()-1)
    		return cout<<0<<endl, 0;
    	int l=0, r=pos.size(), res=r;
    	auto check=[&](int mid) -> bool
    	{
    		int k=pos.size(), x=k-mid;
    		for(int i=0; i<=mid; i++)
    		{
    			int l=pos[i], r=pos[i+x-1];
    			if(r-l+1-x<=mid)
    				return true;
    		}
    		return false;
    	};
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(check(mid)) r=mid-1, res=mid;
    		else l=mid+1;
    	}
    	cout<<res<<endl;
    	return 0;
    }
    

    信息

    ID
    20
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    113
    已通过
    17
    上传者