2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛)解题报告 | 珂学家


前言


题解

2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛),陈越姐姐出题。

国赛比省赛,难度增强了不少,题目就剩下4个题了。

涉及堆栈,hash表,优先队列等高阶数据结构的使用,也有搜索等算法的使用。


RC-v1 简版2048

分值: 20

思路: 栈的使用

一维2048游戏,需要注意级联反应, 退出条件

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> stk;
    for (int i = 0; i < n; i++) {
        int v; cin >> v;
        // 级联反应
        while (!stk.empty() && stk.back() == v) {
            stk.pop_back();
            v++;
        }
        if (stk.size() < m) stk.push_back(v);
        else break;  // 这个break很关键
    }
    for (int i = 0; i < stk.size(); i++) {
        cout << stk[i] << " \n"[i == stk.size() - 1];
    }
    return 0;
}

RC-v2 为 i 做 e

分值: 25分

思路:模拟 + hash表运用

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    map<string, int> mp;
    for (int i = 0; i < n; i++) {
        string s, x;
        cin >> s >> x;
        mp[s] = (x[0] == 'i' ? 0 : 1);
    }

    vector<int> ans;
    int m;
    cin >> m;
    for (int i = 0; i < m; i++) {
        int k; 
        cin >> k;

        int acc = 0;
        for (int j = 0; j < k; j++) {
            string s;
            cin >> s;
            acc += mp[s];
        }
        if (acc == 0) ans.push_back(i + 1);
    }
    if (ans.empty()) cout << "None" << endl;
    else {
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << " \n"[i== ans.size() - 1];
        }
    }

    return 0;
}

RC-v3 乘法小宇宙

分值: 25分

思路: 搜索

从图中挖掘限制条件:

  1. a有n位
  2. b是2位
  3. c是n+1位
  4. d是n+1位
  5. p是n+2位

同时abcdp都是基于s集合

因为集合s最多5个元素,因此可以暴力全枚举,即 O ( 5 10 < 1 0 7 ) O(5^{10}<10^7) O(510<107)

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

bool check(int64_t v, vector<int> &vis) {
    while (v > 0) {
        int r = (int)(v % 10);
        if (vis[r] == 0) return false;
        v /= 10;
    }
    return true;
}

bool check2(int64_t v, int n) {
    int cnt = 0;
    while (v > 0) {
        v /= 10;
        cnt++;
    }
    return cnt == n;
}

int n, k;
vector<int> s;
vector<int> vis(10);
vector<array<int, 2>> bs;

vector<array<int, 2>> res;

void dfs(int i, int av) {
    if (i == n) {
        for (auto &e: bs) {
            int64_t cv = (int64_t)av * e[1];
            int64_t dv = (int64_t)av * e[0];
            if (check(cv, vis) && check2(cv, n + 1) 
                && check(dv, vis) && check2(dv, n + 1) 
                && check(dv * 10 + cv, vis) && check2(dv * 10 + cv, n + 2)) {
                res.push_back({av, e[0] * 10 + e[1]});
            }
        }
        return;
    } 
    for (int &v: s) {
        dfs(i + 1, av * 10 + v);
    }
}

int main() {


    cin >> n >> k;
    for (int i = 0; i < k; i++) {
        int v;
        cin >> v;
        vis[v] = 1;
        s.push_back(v);
    }
    sort(s.begin(), s.end());


    for (auto &b1: s) {
        for (auto &b2: s) {
            bs.push_back({b1, b2});
        }
    }

    dfs(0, 0);

    if (res.empty()) {
        cout << "No Solution\n";
    } else {
        for (auto &e: res) {
            cout << e[0] << " " << e[1] << "\n";
        }
    }

    return 0;
}

RC-v4 实时中位线

分值: 30分

思路: 对顶堆

这是对顶堆的板子题,不过其值域被范围被限定100,其实是道值域统计题

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin >> n;

    // 利用对顶堆来实现吧
    priority_queue<int, vector<int>, less<int>> pq1;
    priority_queue<int, vector<int>, greater<int>> pq2;

    for (int i = 0; i < n; i++) {
        int v;
        cin >> v;
        if (i % 2 == 0) {
            if (!pq2.empty() && pq2.top() < v) {
                pq1.push(pq2.top()); 
                pq2.pop();
                pq2.push(v);
            } else {
                pq1.push(v);    
            }
            cout << pq1.top() << ".0" << '\n';
        } else {
            if (!pq1.empty() && pq1.top() > v) {
                pq2.push(pq1.top()); 
                pq1.pop();
                pq1.push(v);
            } else {
                pq2.push(v);
            }
            cout << fixed << setprecision(1) <<  (pq1.top() + pq2.top()) / 2.0 << '\n';
        }
    }
    
    return 0;
}

写在最后

相关推荐
week_泽2 分钟前
第4课:为什么记忆能力如此重要 - 学习笔记_4
人工智能·笔记·学习·ai agent
week_泽1 小时前
第6课:如何管理短期记忆和长期记忆 - 学习笔记_6
人工智能·笔记·学习·ai agent
程序员泡椒1 小时前
二分查找Go版本实现
数据结构·c++·算法·leetcode·go·二分
小雨下雨的雨1 小时前
Flutter鸿蒙共赢——墨染算法:柏林噪声与鸿蒙生态中的数字水墨意境
算法·flutter·华为·交互·harmonyos·鸿蒙
瑾修1 小时前
golang查找cpu过高的函数
开发语言·后端·golang
kkkAloha1 小时前
JS笔记汇总
开发语言·javascript·笔记
NAGNIP7 小时前
万字长文!回归模型最全讲解!
算法·面试
之歆7 小时前
Spring AI入门到实战到原理源码-MCP
java·人工智能·spring
LawrenceLan7 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
知乎的哥廷根数学学派7 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵