2022 RoboCom 世界机器人开发者大赛-高职组(省赛)。
主题和关怀老人有关系,正能量满满。
整体很基础, 唯有T6 拼瓷砖 还稍有点意思。
分值: 5分
题型: hello world 变形题
#include
using namespace std;
int main() {
cout << "Nin Hao Ya ~\n";
return 0;
}
分值: 10分
考察点:基本的分支判定等
#include
using namespace std;
int main() {
string s, x, m;
cin >> s >> x >> m;
if (s == "F") {
cout << x << " NaiNai Nin Hao Ya ~\n";
} else {
cout << x << " YeYe Nin Hao Ya ~\n";
}
return 0;
}
分值: 10分
#include
using namespace std;
int main() {
int n, T;
cin >> n >> T;
for (int i = 0; i < n; i++) {
string s;
int v;
cin >> s >> v;
if (v < 80 - T || v > 80 + T) {
cout << s << " " << v << "\n";
}
}
return 0;
}
分值: 15分
考察字符的大写小写互转,左移/右移变换
需要注意的是:
#include
using namespace std;
int main() {
int n;
char c;
cin >> n >> c;
string s;
cin >> s;
string res;
res.push_back(c);
for (int i = 0; i < n; i++) {
char op = s[i];
if (op == '0') {
if (c >= 'a' && c <= 'z') {
c = toupper(c);
res.push_back(c);
} else if (c >= 'A' && c <= 'Z') {
c = tolower(c);
res.push_back(c);
}
} else {
if (c >= 'b' && c <= 'z') {
c = c - 1;
res.push_back(c);
}
else if (c >= 'A' && c < 'Z') {
c = c + 1;
res.push_back(c);
}
}
}
cout << res << endl;
return 0;
}
分值: 15分
考察点: 整数的按位操作
#include
using namespace std;
int main() {
int u, v;
cin >> u >> v;
int r1 = 0, r2 = 1;
while (u > 0) {
r1 += (u % 10);
u /= 10;
}
while (v > 0) {
r2 *= (v % 10);
v /= 10;
}
if (r1 < r2) {
swap(r1, r2);
}
cout << r1 << r2 << "\n";
return 0;
}
分值: 20分
题型: 模拟
按照题目进行模拟
for i in range(n):
for j in range(m):
if vis[i][j]: continue;
w = 0
# 枚举正方形的边长
for k in range(1, min(n - i, m - j)):
# 增量check,新增的行和列
# change w * w set true
大概是按照这个框架进行,这边时间复杂度预估很有意思
很像单调栈那种均摊,即一进一出,所以别看有4个for循坏,实际上时间复杂度为 O ( n ∗ m ) O(n*m) O(n∗m)。
如果你只得到 15/20
不妨考虑下如下case
输入
3 3
baa
aaa
aaa
输出
3
color = a; size = 1; amount = 4
color = a; size = 2; amount = 1
color = b; size = 1; amount = 1
在扩展匹配的时候,需要把已经访问的排除在外。 在扩展匹配的时候,需要把已经访问的排除在外。 在扩展匹配的时候,需要把已经访问的排除在外。
#include
using namespace std;
struct Sq {
char c;
int w;
bool operator<(const Sq&lhs) const {
if (c != lhs.c) return c < lhs.c;
return w < lhs.w;
}
};
int main() {
int n, m;
cin >> n >> m;
vector<string> g(n);
for (int i = 0; i < n; i++) {
cin >> g[i];
}
vector<vector<bool>> vis(n, vector<bool>(m, false));
map<Sq, int> hp;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vis[i][j]) continue;
int w = 1;
for (int L = 1; i + L <= n && j + L <= m; L++) {
bool ok = true;
for (int k = 0; k < L; k++) {
if (g[i + L - 1][j+k] != g[i][j] || vis[i+L - 1][j+k]) {
ok = false;
break;
}
}
for (int k = 0; k < L; k++) {
if (g[i + k][j+L - 1] != g[i][j] || vis[i+k][j+L-1]) {
ok = false;
break;
}
}
if (!ok) {
break;
}
w = L;
}
for (int s = 1; s <= w; s++) {
for (int t = 1; t <= w; t++) {
vis[i + s - 1][j + t - 1] = true;
}
}
hp[{g[i][j], w}]++;
}
}
cout << hp.size() << "\n";
for (auto &[e, v] : hp) {
cout << "color = " << e.c << "; size = " << e.w << "; amount = " << v << "\n";
}
return 0;
}
分值: 25分
知识点: 集合的差集操作
#include
using namespace std;
int main() {
int n;
cin >> n;
set<string> out;
for (int i = 0; i < n; i++) {
string s; cin >> s;
out.insert(s);
}
int m;
cin >> m;
set<string> in;
for (int i = 0; i < m; i++) {
string s; cin >> s;
in.insert(s);
}
vector<string> res;
for (auto &k: out) {
if (in.find(k) == in.end()) res.push_back(k);
}
if (res.empty()) {
cout << "All Back\n";
} else {
cout << "Missing: " << res.size() << "\n";
for (string &k: res) cout << k << "\n";
}
vector<string> res2;
for (auto &k: in) {
if (out.find(k) == out.end()) res2.push_back(k);
}
if (res2.empty()) {
cout << "All Known\n";
} else {
cout << "New: " << res2.size() << "\n";
for (string &k: res2) cout << k << "\n";
}
return 0;
}
也可以借助stl中的set_difference函数
#include
using namespace std;
int main() {
int n;
cin >> n;
set<string> out;
for (int i = 0; i < n; i++) {
string s; cin >> s;
out.insert(s);
}
int m;
cin >> m;
set<string> in;
for (int i = 0; i < m; i++) {
string s; cin >> s;
in.insert(s);
}
vector<string> res;
set_difference(out.begin(), out.end(), in.begin(), in.end(),
inserter(res, res.begin()));
if (res.empty()) {
cout << "All Back\n";
} else {
cout << "Missing: " << res.size() << "\n";
for (string &k: res) cout << k << "\n";
}
vector<string> res2;
set_difference(in.begin(), in.end(), out.begin(), out.end(),
inserter(res2, res2.begin()));
if (res2.empty()) {
cout << "All Known\n";
} else {
cout << "New: " << res2.size() << "\n";
for (string &k: res2) cout << k << "\n";
}
return 0;
}