前言

题解
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分
思路: 搜索

从图中挖掘限制条件:
- 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)
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;
}
写在最后
