题目链接: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; } }