题目链接:https://codeforc.es/contest/1708/problem/C

一道比较标准的蓝题难度,用到了二分

大意是:给出n个任务的难度,智商为q。如果任务难度>q ,那么q会减少1,如果不做这个任务,智商不变,求最多能做出的任务的状态。
也就是做这个任务标记1否则0。

这个题我看出了是二分,但是没想明白在哪里二分。另外这个题除了二分还有一个重要的地方就是后缀和,判断从这个位置到最后是否可以全部将任务做完。这样前面的任务只要是小于等于智商的我们就做,否则就不做,这个位置之后的任务,我们全部都做。

code:

#include<bits/stdc++.h>
using namespace std;
const int nn = 1e5+10;
int a[nn];
int n,q;
bool is_ok(int x)
{
	int q1 = q;
	for(int i=x;i<=n;i++) if(a[i]>q1) q1--;
	return q1>=0;
}
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>q;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int l = 1 ,r = n-q+1;
		while(l<r)
		{
			int mid = l+r>>1;
			if(is_ok(mid)) r = mid;
			else l = mid+1;
		}
		for(int i=1;i<l;i++)	cout<<(a[i]<=q);
		for(int i=l;i<=n;i++) cout<<1;
		cout<<endl; 
	}
}