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;
}

浙公网安备 33010602011771号