小白学睿抗竞赛历年题:2023
看的是trudbot这位大佬的题解:2023 RoboCom 世界机器人开发者大赛-本科组(省赛) CAIP 完整版题解_2023caip题目-优快云博客
T1:RC-u1 亚运奖牌榜
//
// Created by trudbot on 2023/7/15.
//
#include <bits/stdc++.h> // 一个包含几乎所有库的c++头文件
using namespace std;
int main () {
int n; cin >> n;
vector<vector<int>> ans(2, vector<int>(4, 0)); //一个二维向量,是动态的可以自动扩容
// 2行,每行4个数,初值为0
while (n --) {
int c, p; cin >> c >> p;
ans[c][p] ++;
}
for (auto &v : ans) { // 只读!!!注意符号':'
for (int i = 1; i <= 3; i ++) {
cout << v[i];
if (i != 3) cout << " ";
}
cout << endl;
}
auto t = ans; //拷贝
sort(ans.begin(), ans.end()); //排序,升序,前面的小
if (t == ans) cout << "The second win!"; //如果ans改变顺序了,代表后面的大
else cout << "The first win!";
return 0;
}
1.vector
C++的vector介绍_c++中vector是什么意思-优快云博客
C++ 二维vector的插入与遍历输出_c++ 二维迭代器如果遍历输出-优快云博客
//向量定义
vector<int> a ; // 声明一个int型向量a
vector<int> a(10) ; // 声明一个初始大小为10的向量
vector<int> a(10, 1) ; // 声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; // 声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; // 将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
//向量遍历
for (int i = 2; i < V.size(); i++)
{
for(int j = 0; j < V[0].size(); j++)
cout << V[i][j] << " ";
cout << endl;
}
2.for(auto &v : ans)
想要拷贝元素:for(auto x:range)
想要修改元素 : for(auto &&x:range)
想要只读元素:for(const auto& x:range)
3.sort(ans.begin(), ans.end());
升序排序,会改变ans元素的顺序-->ans.begin()<ans.end()
c++ string的字典排序_字典序排序 c++string-优快云博客
T2:出院
//
// Created by trudbot on 2023/7/15.
//
#include <iostream>
#include<cstring>
#include<map>
using namespace std;
#define x first
#define y second
int main() {
int n, m; cin >> n >> m;
map<string, string> level; //map< , > 字典名
level.insert(pair<string, string>("nihao", "X"));
while(n--) {
string s, lev; cin >> s >> lev;
level[s] = lev;
}
while(m--) {
string s; cin >> s;
//如果已知等级
//int l = level.count(s); //count:字典里s元素的个数(判断是否存在)
//cout << l << endl;
if (level.count(s)) cout << level[s] << endl;
else {
int cnt = 0;
string res;
for (auto& p : level) {
//cout << p.x << endl; 字典键值对的键名
//cout << p.x.size() << endl; 字典键名的长度
if (p.x.size() < s.size()
&& s.substr(0, p.x.size()) == p.x //是否为前缀
&& level.count(s.substr(p.x.size()))) { //后缀是否已知
cnt++, res = p.y + level[s.substr(p.x.size())]; //cout << 1 << endl;
}
}
if (cnt != 1) res = "D";
cout << res << endl;
}
}
return 0;
}
1.map<string, string> level; 创建了一个字典level
C++ 字典 map详解_c++怎么实现词典查找-优快云博客
2. 字符串substr(size_t pos,size_t len)const;
此函数将两个值pos和len作为参数,并返回一个新构造的字符串对象,其值初始化为该对象的子字符串的副本。从pos开始复制字符串,直到pos + len表示[pos,pos + len)为止。
T4:相对论
#include <iostream>
#include<queue>
#include<cstring>
#include <map>
#include<unordered_map>
using namespace std;
const int N = 4010;
int n, m;
string name[N];
vector<int> g[N];
unordered_map<string, int> id; //访问单个元素比map快,其他和map几乎一致
vector<int> bfs(int start, int end) { //一个叫bfs的函数
queue<int> q; //队列q
vector<int> last(n + 1, 0); //一个变量last 有n+1个元素,赋初值0
q.push(start); //在q队列队尾放入新元素 start
while (!q.empty()) { //q.empty() 如果队列为空返回true,否则返回false
// (队列不空执行该循环)
int u = q.front(); q.pop(); //q.front() 返回队首元素的值,但不删除该元素
//u是队首元素 //q.pop() 删除队列首元素但不返回其值
if (u == end) break;
for (auto& v : g[u])
if (last[v] == 0)
last[v] = u, q.push(v);
}
vector<int> res;
do {
res.push_back(end), end = last[end];
} while (end != 0);
return res;
}
void print(int u, bool space) {
cout << name[u] << " " << u - id[name[u]];
if (space) cout << " ";
}
int main() {
cin >> m;
//编号、建图
for (int i = 1; i <= m; i++) {
string s1, s2;
int st1, st2;
cin >> s1 >> st1 >> s2 >> st2;
if (!id.count(s1)) { //字典id里没有s1?
n += 2, id[s1] = n - 1, name[n - 1] = name[n] = s1;
}
if (!id.count(s2)) {
n += 2, id[s2] = n - 1, name[n - 1] = name[n] = s2;
}
g[id[s1] + st1].push_back(id[s2] + st2);
}
//取最短路径
vector<int> res(2000);
for (int i = 1; i <= n; i += 2) {
auto p1 = bfs(i, i + 1), p2 = bfs(i + 1, i);
if (res.size() > p1.size() && p1.size() > 1) res = p1;
if (res.size() > p2.size() && p2.size() > 1) res = p2;
}
//打印格式
for (int i = res.size() - 1; i >= 1; i--) {
print(res[i], true), print(res[i - 1], true);
}
cout << "= ", print(res.back(), true), print(res[0], false);
return 0;
}
1.unordered_map:
访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
其他没什么区别,只是不按键值排序
2.queue队列C++-queue:queue基本用法【q.push(x)、q.front()、q.back()、q.pop()、q.size()、q.empty()】-优快云博客
3.bfs深度优先第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)_dfs bfs-优快云博客
T5:相对成功与相对失败
//
// Created by trudbot on 2023/7/15.
//
#include <bits/stdc++.h>
using namespace std;
int main () {
int T; cin >> T;
for (int t = 1; t <= T; t++) {
int n; cin >> n;
vector<int> s(n + 1, 0);
for (int i = 1; i <= n; i ++) {
int a, b; cin >> a >> b;
s[i] = a + 1 - b; //第i个人的得分
}
vector<int> dp(3, 0);
int mx = 0;
for (int i = 0; i < n; i ++) {
int x; cin >> x;
for (int j = s[x]; j < 3; j ++)
dp[s[x]] = max(dp[s[x]], dp[j] + 1);
mx = max(dp[s[x]], mx);
}
cout << n - mx << endl;
}
return 0;
}
1.DP:算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)-优快云博客
此题为最长下降子序列
其他:
1.csting:C++标准库头文件解释_include<iostream>-优快云博客
2. 判断字符串是否是数字,大小写字母等C++判断字符(串)是否是数字或者字母及大小写转换_c++ 判断字符串是是否包含字母a-z a-z 不使用正则-优快云博客
3.迭代器:C++迭代器(STL迭代器)iterator详解-优快云博客
(类似指针)