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

写在最后

相关推荐
衡石科技7 分钟前
衡石科技携手超聚变联合发布HENGSHI BOX,引领私域ChatBI规模化落地
大数据·人工智能·科技
Lhan.zzZ7 分钟前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
敲代码的嘎仔11 分钟前
28届后端开发-海康威视日常实习一面(已OC)
java·开发语言·后端·面试·海康威视·实习·大厂
新知图书12 分钟前
10.4 交互优化与用户体验提升
人工智能·多模态·智能体
IT_陈寒33 分钟前
JavaScript数组排序踩的坑,差点让我加班到凌晨
前端·人工智能·后端
敢敢是只喵i37 分钟前
一个本地 AI Agent 要操作多个门店或 SaaS 账号,应该怎样安全切换身份?
人工智能·安全·ai·系统架构·业界资讯
wangchunyu11438 分钟前
Aider介绍和安装说明
人工智能
SpaceAIGlobal1 小时前
AI做PPT 工具哪个好:先搞懂原理,再按 3 个维度挑对那一个(2026)
人工智能·powerpoint
β添砖java1 小时前
深度学习28RNN循环神经网络
人工智能·深度学习
2301_818474441 小时前
福建中小微企业云 ERP 落地实践:轻量化信息化项目实施指南
大数据·人工智能