A. Doremy's IQ 1600
题意:
一个人做测试,初始时他的给出他的IQ,然后给出n个测试,每个测试的值为a[i],当a[i]<=IQ时,可以直接做这个测试,当a[i]>IQ时,可以选择不做这个测试或者选择做这个测试但之后IQ要减一,问最多可以做多少个测试,如果做了第i个测试就输出1否则输出0
思路:
反向考虑,因为要做的测试最多,所以我们假设最后IQ已经减到0了,然后反向考虑,假设一个值NQ为当前的IQ,当a[i]小于等于当前的IQ即NQ时,显然我们可以做这个测试。当a[i]大于当前的IQ即NQ时,如果当前NQ小于IQ我们就可以做这个测试,否则如果NQ已经等于IQ了那我们就不能做这个测试,因为IQ不够,而由于正向考虑我们是减一,所以反向考虑我们NQ要加一。
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 100010; int n, m; int a[N], b[N]; int main() { int T; cin >> T; while(T -- ) { cin >> n >> m; for (int i = 1; i <= n; i ++ ) cin >> a[i]; int now = 0; for (int i = n; i >= 1; i -- ) if (a[i] <= now) b[i] = 1; else if(now < m) { now++; b[i] = 1; } else b[i] = 0; for (int i = 1; i <= n; i ++ ) cout << b[i]; cout << endl; } return 0; }