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

发布于:2025-05-18 ⋅ 阅读:(23) ⋅ 点赞:(0)

前言

在这里插入图片描述


题解

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

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

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

在这里插入图片描述


RC-v1 简版2048

分值: 20

思路: 栈的使用

在这里插入图片描述
一维2048游戏,需要注意级联反应, 退出条件

#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表运用

#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)

#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,其实是道值域统计题

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

写在最后

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到