CF1474-A. Puzzle From the Future

CF1474-A. Puzzle From the Future

题意:

有两个由\(0,1\)组成的、长度相等字符串\(a, b\),两个字符串按位相加得到一个新的字符串\(s\),对\(s\)\(unique\)即可得到由\(0,1,2\)组成的字符串\(c\)。现在给出你字符串\(b\),让你找到一个字符串\(a\),使得经过上述操作之后得到的字符串\(c\)所代表的数字最大。


思路:

简单的贪心(虽然当时卡了一会儿:( )。让字符串\(c\)前面的数字尽量的大,而且要保证取\(unique\)操作的时候长度没有变化,因为那样数字必然会变小(毕竟不在一个数量级上了)。

具体的做法是,先找到一个最大的\(c\),然后用\(c,b\)按位减就可以得到\(a\)。首先\(b\)的第一位先加上\(1\)得到\(c\)的第一位:\(c[0]=b[0]+1\)。然后对于第二位开始的每一位\(b[i]\),如果\(c[i-1]\)不等于\(b[i]+1\),那么当前位\(c[i]=b[i]+1\),否则不做任何操作,即\(c[i]=b[i]\)。这样就可以得到最大的字符串\(c\),也就得到了目标字符串\(a\)


AC代码:

#include <cstdio>
#include <cstring>

const int Maxn = 100005;

char b[Maxn], c[Maxn];

void solve() {
    int n;
    scanf("%d %s", &n, b);
    c[0] = b[0] + 1;
    for (int i = 1; i < n; i++) {
        if (c[i - 1] != b[i] + 1) {
            c[i] = b[i] + 1;
        } else {
            c[i] = b[i];
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%c", c[i] - b[i] + '0');
    }
    printf("\n");
}

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        solve();
    }

    return 0;
}

posted @ 2021-01-20 21:43  牟翔宇  阅读(114)  评论(0编辑  收藏  举报