前言
题解
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分
思路: 搜索
从图中挖掘限制条件:
- a有n位
- b是2位
- c是n+1位
- d是n+1位
- 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;
}