第五届上海市青少年算法竞赛 题解

第五届上海市青少年算法竞赛 题解
本次比赛涉及算法:字符串、贪心、枚举模拟、 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 2n300000
题解:按照题意直接暴力模拟就好了,可以用 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) (1k1,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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值