原题
题意
Doremy有n个测试,每个测试
i
i
i都有一个难度
a
i
a_i
ai,这
n
n
n个测试必须按
i
i
i从小到大的顺序来做。Doremy有一个智商值
q
q
q,他可以选择是否做第
i
i
i个测试,如果选择做,则:
① 他的智商值
q
<
a
[
i
]
q<a[i]
q<a[i],则他的智商值
−
1
-1
−1
②他的智商值
q
>
=
a
[
i
]
q>=a[i]
q>=a[i],他的智商值不变
如果他不选择做,则他的智商值不变
只有当Doremy的智商值大于0时,才能做测试。
他想尽可能做更多的测试,求出一种最优方案。
思路
如果要尽可能多地做测试,因为不论测试难度是多少,只要满足
q
≥
a
i
q≥a_i
q≥ai,智商值就不变,因此把降智的测试放在后面看,贪心来做,最优选择即当做到最后一个测试时智商刚好为1。
因此可以先把每场测试的最小智商
m
i
n
q
minq
minq预处理出来:从最后一个测试开始看,要能够做最后一个测试,智商值至少为1。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
typedef long long ll;
int t, n, q;
int a[N], minq[N];
int ans[N];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> t;
while(t -- )
{
cin >> n >> q;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
minq[n + 1] = 0;
for(int i = n; i >= 1; i -- )
{
if(a[i] > minq[i + 1])
minq[i] = minq[i + 1] + 1;
else
minq[i] = minq[i + 1];
}
for(int i = 1; i <= n; i ++ )
{
if(q >= a[i])
{
ans[i] = 1;
}
else
{
if(q >= minq[i])
{
q--;
ans[i] = 1;
}
else ans[i] = 0;
}
}
for(int i = 1; i <= n; i ++ )
cout << ans[i];
cout << endl;
}
return 0;
}