Anye
Anye
Published on 2019-10-21 / 11 Visits
0
0

【百题千解】题解 P5595 【【XR-4】歌唱比赛】

这道题在月赛的时候我本来是 想用 string 稳过的,结果发现看不懂题,没理解不合法的情况,看了看题解没有 dalao 用 string 解,我就来用 string 解一下这道题。

这道题完全可以用字符串来解决,我在这里 @文·和 可以参考一下。

思路

首先,这道题其实我们完全可以自定义它高出的分数,那么我们就以 0 和 1 为例。

先完成合法情况:

合法情况很简单,只需要判断给定的字符串中出现的 X,Y,Z;

那么 74 分代码就出现了

for (int i = 0; i <= f.size(); ++i) {
    if (f[i] == 'Z') {
        a += '0', b += '0';
    }
    if (f[i] == 'X') {
        a += '1', b += '0';
    }
    if (f[i] == 'Y') {
        a += '0', b += '1';
    }
}

然后 我们来考虑一下不合法的情况,共有3种。

  1. 当Z位于字符串最后一位且前面没有出现Z的时候,是合法的。

  2. 当Z存在于字符串中间的时候,不合法。

  3. 当Z存在于字符串中间但其后面全都是Z的时候,合法。

那么我们可以写出 判断函数

bool canot() {
    int len = f.size(), cnt = 0;
    for (int i = len - 1; i >= 0; i--)
        if (f[i] == 'Z') can[++cnt] = i;
    for (int i = len - 1; i >= len - cnt; i--)
        if (f[i] != 'Z') return false;
    return true;
}

这里参考了 Morbid 大佬的题解思路

那么这道题就可以用 string 解出来了

挂一份 AC 代码

bool canot() {
    int len = f.size(), cnt = 0;
    for (int i = len - 1; i >= 0; i--)
        if (f[i] == 'Z') can[++cnt] = i;
    for (int i = len - 1; i >= len - cnt; i--)
        if (f[i] != 'Z') return false;
    return true;
}

int main()
{
    cin >> f;
    if (!canot()) {
        puts("-1");
        return 0;
    }
    for (int i = 0; i <= f.size(); ++i) {
        if (f[i] == 'Z') {
            a += '0', b += '0';
        }
        if (f[i] == 'X') {
            a += '1', b += '0';
        }
        if (f[i] == 'Y') {
            a += '0', b += '1';
        }
    }
    cout << a << endl << b;

这份代码防作弊而加了一点小操作,需要读者自己思考变量的定义。

提示:注意 can 字符串的定义。


Comment