editorial - 2024

2024 题解

做法 1:按照题意模拟。

std::string 提供了很多方便的字符串处理方法。

erase 函数可以删除一个子串。

erase 的(其中一个)用法是 s.erase(index, length),从字符串 s 中的下标 index 处开始删除一个长度为 length 的子串。(其中 s 是一个 std::string 类型的字符串)

substr 函数可以取出一个子串。(不更改原来的字符串)

substr 的(其中一个)用法是 s.substr(index, length) 从字符串 s 中的下标 index 处开始取出一个长度为 length 的子串并返回。(其中 s 是一个 std::string 类型的字符串)

更多科技可以浏览 c++ reference 的“成员函数”部分。

对于本题,首先我们读入 \(T\),然后进行一个 \(T\) 次的循环:

读入字符串 \(s\),如果它是 2024 就输出 Yes

否则枚举 \(s\) 的每个长度为 \(4\) 的连续子串 \(t\),首先判断 \(t\) 是不是 2024,如果不是就枚举下一个子串。如果是,我们利用 erase 函数从 \(s\) 中删除掉这个子串,并判断删除后的 \(s\) 是不是 2024

注意,每次判断后如果失败,因为此时 erase 已经更改了 \(s\),现在我们需要利用 insert 函数重新在这里插入一个 2024。或者,另一个办法是把 \(s\) 先复制一份存到另一个变量 \(s'\) 中,然后在 \(s'\) 上做更改,这样不会影响 \(s\)。代码中用的是第二种方法。

参考实现:

#include <bits/stdc++.h>

using namespace std;

signed main()
{
    int t; cin >> t;
    for (int i = 1; i <= t; i++)
    {
        string s;
        cin >> s;
        if (s == "2024")
        {
            cout << "Yes\n";
            return;
        }
        bool flag = false;
        for (int i = 0; i + 4 < s.length(); i++)
        {
            string t = s;
            if (t.substr(i, 4) != "2024") continue;
            t.erase(i, 4);
            if (t == "2024")
            {
                flag = true;
                break;
            }
        }
        if (flag) cout << "Yes\n";
        else cout << "No\n";
    }
    return 0;
}

做法 2:

合法的字符串只有 \(5\) 个:2024,20242024,22024024,20202424,20220244

读入后判断即可。参考实现:(来自 dark_moon 大佬,orz)

#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main(){
    int t;
    scanf("%d", &t);
    while(t --){
        string s;
        cin >> s;
        if(s == "20242024" || s == "20220244" || s == "20202424" || s == "22024024" || s == "20242024" || s == "2024")
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}
posted @ 2024-02-12 20:00  cndark_moon  阅读(14)  评论(0)    收藏  举报