2025年睿抗机器人开发者大赛CAIP-编程技能赛-高职组(省赛)解题报告 | 珂学家
前言
题解
2025年睿抗机器人开发者大赛CAIP-编程技能赛-高职组(省赛)
整体还是过于简单,加上参与人数少,感觉前排特别卷,满分70/248人。
RC-v1 加点 bug
题型: hello world 系列
#include <bits/stdc++.h>using namespace std;int main() {cout << "If debugging is the process of removing bugs, "<< "then programming must be the process of putting them in.\n";return 0;
}
RC-v2 哥哥姐姐还是弟弟妹妹
分数: 10
题型: 分支判定
#include <bits/stdc++.h>using namespace std;int main() {int n, m, s;cin >> n >> m >> s;if (n > m) {cout << m << " " << (s == 0 ? "MM" : "DD") << "\n";} else {cout << m << " " << (s == 0 ? "JJ" : "GG") << "\n";}return 0;
}
RC-v3 小动物的叫声
分数: 10分
知识点: 映射
#include <bits/stdc++.h>using namespace std;char *str[] = {"gugugu", "gagaga","jijiji","miaomiaomiao","wangwangwang"
};int main() {int n;cin >> n;while (n-- > 0) {int m; cin >> m;cout << str[m - 1] << "\n";}return 0;
}
RC-v4 网络用语
分数: 15
知识点:字符串
其实是字符串多模版匹配的板子题,但是数据规模小,可以暴力求解
#include <bits/stdc++.h>using namespace std;string replace(string s, string p) {string res;int n = s.length();int m = p.length();for (int i = 0; i < n; i++) {if (i + m <= n && s.substr(i, m) == p) {res += "*" + p + "*";i += m - 1;} else {res += s[i];}}return res;
}int main() {int n;cin >> n;vector<string> ps(n);for (int i = 0; i < n; i++) {cin >> ps[i];}string s;cin >> s;for (string &e: ps) {s = replace(s, e);}cout << s << "\n";return 0;
}
注意: 是找到匹配项后,前后加入*括起来
RC-v5 骗钱的手机游戏
分值: 15
知识点: 函数递推
#include <bits/stdc++.h>using namespace std;int main() {vector<int> arr(9);for (int i = 0;i < 9; i++) {int v = 0;cin >> v;arr[i] += v;if (i + 1 < 9) {if (i % 2 == 1) {arr[i + 1] += arr[i] / 3;arr[i] %= 3;} else {arr[i + 1] = arr[i] / 2;arr[i] %= 2;}}}for (int i = 0; i < 9; i++) {cout << arr[i] << " \n"[i == 8];}return 0;
}
RC-v6 代码查重
分值: 20分
知识点: 映射+排序
#include <bits/stdc++.h>using namespace std;struct E {string at = "";int score = -1;
};int main() {int n, m;cin >> n >> m;vector<E> arr(m);for (int i = 0; i < n; i++) {string s1, s2;int x, y;cin >> s1 >> s2 >> x >> y;x--;if (y > arr[x].score) {arr[x].score = y;arr[x].at = s1 + " " + s2;}}vector<int> vec;for (int i = 0; i < m; i++) {if (arr[i].score >= 0) vec.push_back(i);}sort(vec.begin(), vec.end(), [arr](auto &a, auto &b) {return arr[a].at < arr[b].at;});int sz = vec.size();for (int i = 0; i < sz; i++) {auto e = arr[vec[i]];cout << e.at << " " << (vec[i] + 1) << " " << e.score << "\n";}return 0;
}
RC-v7 小白兔们拔萝卜
分值: 20
思路: 贪心
需要注意,这边涉及2次排序
- 一次用于贪心最少次数,
- 一次用于结果的输出
#include <bits/stdc++.h>using namespace std;int main() {int n, T;cin >> n >> T;vector<int> arr(n), idx(n);for (int i = 0; i < n; i++) {cin >> arr[i];idx[i] = i;}sort(idx.begin(), idx.end(), [arr](auto &a, auto &b) {return arr[a] > arr[b]; });int sum = 0, last = -1;for (int i = 0; sum < T && i < n; i++) {sum += arr[idx[i]];last = i;}if (sum < T) {cout << 0 << "\n";cout << "Suan4 le ba, hai2 cha4 " << (T - sum) << ".\n";} else {cout << (last + 1) << "\n";sort(idx.begin(), idx.begin() + last + 1);for (int i = 0; i <= last; i++) {cout << (idx[i] + 1) << " \n"[i == last];}}return 0;
}