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;
}
posted @ 2022-07-22 15:30  彦辰kkkkk  阅读(84)  评论(0)    收藏  举报