第五届上海市青少年算法竞赛 题解
本次比赛涉及算法:字符串、贪心、枚举模拟、 m a p map map、数学、思维、栈、折半查找、广度优先搜索
今年比赛整体的题目难度和思维难度还是偏大的,对小朋友们的逻辑思维、分析能力和运用能力有一定要求,特别是最后一题要拿满分,对于细节的处理要考虑周全, 2 2 2小时的比赛时间确实有点太短了。
比赛时间:2024 年 4 月 6 日
比赛链接:https://iai.sh.cn/contest/63
第一题:T1符号译码
标签:字符串、枚举模拟、 m a p map map
题意:给定 01 01 01串和字符之间的编码规则,给出一个 01 01 01字符串,要求输出对应的符号序列。
(字符串长度为 n n n, 2 ≤ n ≤ 300000 2≤n≤300000 2≤n≤300000)
题解:按照题意直接暴力模拟就好了,可以用 m a p map map优化下代码逻辑。下面给出两种的写法的代码。
代码:
普通暴力版:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == '0' && s[i+1] == '1' && s[i+2] == '0') {
cout << '[';
i += 2;
}
else if (s[i] == '1' && s[i+1] == '0' && s[i+2] == '1') {
cout << ']';
i += 2;
}
else if (s[i] == '0' && s[i+1] == '0') {
cout << '<';
i += 1;
}
else if (s[i] == '1' && s[i+1] == '1') {
cout << '>';
i += 1;
}
else if (s[i] == '0' && s[i+1] == '1' && s[i+2] == '1') {
cout << '+';
i += 2;
}
else if (s[i] == '1' && s[i+1] == '0' && s[i+2] == '0') {
cout << '-';
i += 2;
}
}
return 0;
}
简洁版、 m a p map map优化版:
#include <bits/stdc++.h>
using namespace std;
map<string, char> m;
int main() {
// map预记录
m["010"] = '['; m["101"] = ']';
m["00"] = '<'; m["11"] = '>';
m["011"] = '+'; m["100"] = '-';
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
if (m[s.substr(i, 3)]) {
cout << m[s.substr(i, 3)];
i += 2;
}
else if (m[s.substr(i, 2)]) {
cout << m[s.substr(i, 2)];
i += 1;
}
}
return 0;
}
第二题:T2数对排序
标签:数学、思维
题意:由两个自然数组成的一对数称之为有序数对,有序是指数对的第一项与第二项是区别的,例如 ( 0 , 1 ) (0,1) (0,1), ( 1 , 0 ) (1,0) (1,0)是不一样的数对。对所有有序数对进行排序,先按照每对中两数之和从小到大排序,两数之和相同,再按照每个数对中第一个数从小到大排序。
例如前 6 6 6个数对为 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 0 , 2 ) , ( 1 , 1 ) , ( 2 , 0 ) (0,0), (0,1), (1,0), (0,2), (1,1), (2,0) (0,0),(0,1),(1,0),(0,2),(1,1),(2,0)
给定一个整数 k k k,求出第 k k k个数对。 ( 1 ≤ k ≤ 1 , 000 , 000 , 000 ) (1≤k≤1,000,000,000) (1≤k≤1,000,000,000)
题解:我们列一下前几个,找下规律:
( 0 , 0 ) (0,0) (0,0)、 ( 0 , 1 ) , ( 1 , 0 ) (0,1), (1,0) (0,1),(1,0)、 ( 0 , 2 ) , ( 1 , 1 ) , ( 2 , 0 ) (0,2), (1,1), (2,0) (0,2),(1,1),(2,0)、 ( 0 , 3 ) , ( 1 , 2 ) , ( 2 , 1 ) , ( 3 , 0 ) (0,3), (1,2), (2,1),(3,0)

最低0.47元/天 解锁文章
555

被折叠的 条评论
为什么被折叠?



