2023robocom省赛小白学习笔记

小白学睿抗竞赛历年题:2023

看的是trudbot这位大佬的题解:2023 RoboCom 世界机器人开发者大赛-本科组(省赛) CAIP 完整版题解_2023caip题目-CSDN博客

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是什么意思-CSDN博客

C++ 二维vector的插入与遍历输出_c++ 二维迭代器如果遍历输出-CSDN博客

//向量定义
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-CSDN博客

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++怎么实现词典查找-CSDN博客

2. 字符串substr(size_t pos,size_t len)const;

此函数将两个值poslen作为参数,并返回一个新构造的字符串对象,其值初始化为该对象的子字符串的副本。从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()】-CSDN博客

3.bfs深度优先第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)_dfs bfs-CSDN博客 

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问题入门(适合零基础者,一看就会)-CSDN博客

此题为最长下降子序列

其他:

1.csting:C++标准库头文件解释_include<iostream>-CSDN博客

2. 判断字符串是否是数字,大小写字母等C++判断字符(串)是否是数字或者字母及大小写转换_c++ 判断字符串是是否包含字母a-z a-z 不使用正则-CSDN博客

3.迭代器:C++迭代器(STL迭代器)iterator详解-CSDN博客

(类似指针)

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值