侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【算法竞赛】2022 RoboCom 世界机器人开发者大赛-高职组(省赛)

GabrielxD
2023-07-08 / 2 评论 / 0 点赞 / 221 阅读 / 3,166 字
温馨提示:
本文最后更新于 2023-07-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

RC-v1 您好呀

本届比赛的主题是“智能照护”,那么就请你首先为智能照护机器人写一个最简单的问候程序 —— 无论遇见谁,首先说一句“您好呀~”。

输入格式:

本题没有输入。

输出格式:

在一行中输出问候语的汉语拼音 Nin Hao Ya ~

输入样例:

输出样例:

Nin Hao Ya ~

解题:模拟

思路

模拟。

代码
#include <cstdio>

using namespace std;

int main() {
    puts("Nin Hao Ya ~");

    return 0;
}

RC-v2 爷爷奶奶您好呀

现在我们把智能机器人的问候语功能升级一下。当机器人遇到一位老人时,可以通过人脸识别获取到老人的姓名和性别,此时就需要你根据这些信息输出有针对性的问候语。例如当机器人识别出对面是一位女性,姓名是“陈越”的时候,它要会说:“陈奶奶您好呀~”。

输入格式:

输入在一行中按照下面的格式给出一位老人的信息:

性别 姓 名

其中 性别 为 F 时表示女性,M 表示男性。姓 和 名 分别为仅由英文字母组成的、长度不超过 10 的非空字符串。

输出格式:

在一行中输出问候语 X Y Nin Hao Ya ~,其中 X 是老人的 Y 是老人的尊称 —— 如果是女性则为 NaiNai,男性则为 YeYe

输入样例 1:

F Chen Yue

输出样例 1:

Chen NaiNai Nin Hao Ya ~

输入样例 2:

M Hilbert David

输出样例 2:

Hilbert YeYe Nin Hao Ya ~

解题:模拟

思路

模拟。

代码
#include <cstdio>

using namespace std;

char sex[5], name[20];

int main() {
    scanf("%s %s", sex, name);
    printf("%s %s Nin Hao Ya ~\n", name, sex[0] == 'M' ? "YeYe" : "NaiNai");

    return 0;
}

RC-v3 智能监测

在护理中心,智能监测仪分分钟记录着老人的各项身体指标,如果某一项指标超过了阈值范围,就会自动联系医护人员。

本题以心率为例,请你实现智能监测的功能,当发现老人的心率过缓或过急时,就发出预警信号。

输入格式:

输入在第一行中给出 2 个正整数:N(≤1000),为心率监测的数据量;T(≤20)为心率波动阈值 —— 这里我们假设在安静状态下健康成人心率大约平均 80 次/分钟,当老人的心率在区间 [80−T,80+T] 内时被认为是正常的。

随后 N 行,每行给出一个时间点和该时刻测得的心率值,格式为:时时:分分:秒秒 心率,其中 时时 是一天内的小时数,取值区间为 [00, 23];分分和秒秒对应分钟数和秒数,取值区间为 [00, 59];心率为不超过 200 的正整数。

输出格式:

按照输入的顺序检查每个给定时刻的心率,如果遇到不正常的数据,在一行中按照输入格式原样输出读到的数据。题目保证至少有一条输出。

输入样例:

5 15
08:01:23 95
08:05:00 100
09:18:23 75
10:23:51 60
12:00:59 80

输出样例:

08:05:00 100
10:23:51 60

解题:模拟

思路

模拟。

代码
#include <cstdio>

using namespace std;

int n, t;
char time[50];
int x;

int main() {
    scanf("%d%d", &n, &t);
    while (n--) {
        scanf("%s %d", time, &x);
        if (x < 80 - t || x > 80 + t) printf("%s %d\n", time, x);
    }

    return 0;
}

RC-v4 生成字母串

英语老师要求学生按照如下规则写一串字母:

  • 如果写了某个大写字母,下一个就必须写同个字母的小写,或者写字母表中下一个字母的大写;
  • 如果写了某个小写字母,下一个就必须写同个字母的大写,或者写字母表中前一个字母的小写。

例如 aAaABCDdcbBC 就是一个合法的字母串;而 dEFfeFGhI 就是非法的。

本题就请你编写程序,自动生成一个合法的字母串。

输入格式:

输入在第一行给出一个不超过 10410^4 的正整数 N 和第一个字母。

随后一行给出一个由 01 组成的长度为 N 的字符串。这个串给出了字母串的生成规则:从第一个字母开始,如果对应的规则串字符是 0,则下一个字母应该生成当前字母的大/小写;如果是 1 则下一个字母应该生成当前字母的前/后一个字母。

**注意:**因为字母表中 a 没有前一个字母,Z 没有后一个字母,所以如果此时遇到 1 就忽略之。

输出格式:

在一行中输出按规则生成的字母串。

输入样例:

12 a
001011101101

输出样例:

aAaABCDdcbBC

解题:模拟

思路

模拟。

代码
#include <cstdio>

using namespace std;

const int N = 1e4 + 10;
int n;
char s[5], a[N];


int main() {
    scanf("%d %s %s", &n, s, a);
    char prev = s[0];
    printf("%c", prev);
    for (int i = 0; i < n; ++i) {
        int curr = a[i] - '0';
        if (curr) {
            if (prev == 'a' || prev == 'Z') continue;
            if (prev >= 'a' && prev <= 'z') --prev;
            else ++prev;
        } else {
            if (prev >= 'a' && prev <= 'z') prev -= 32;
            else prev += 32;
        }
        printf("%c", prev);
    }

    return 0;
}

RC-v5 数字宝宝

为了教宝宝做算术,老师布置了一个作业,题目是这样的:给宝宝两个小于 1000 的正整数,要求宝宝把第一个数字的每一位加起来,得到一个数字 A;再把第二个数字的每一位乘起来,得到一个数字 B。最后要求宝宝把 A 和 B 并排放,大的那个放左边,小的放右边。

这个作业可有点难,下面就请你写个程序,帮助宝宝完成。

输入格式:

输入在一行中给出两个小于 1000 的正整数,数字间以空格分隔。

输出格式:

在一行中按老师的要求输出结果。

输入样例 1:

123 45

输出样例 1:

206

输入样例 2:

67 890

输出样例 2:

130

解题:模拟

思路

模拟。

代码
#include <cstdio>
#include <algorithm>

using namespace std;

int x, y, a, b = 1;

int main() {
    scanf("%d%d", &x, &y);
    if (!y) b = 0;
    while (x) {
        a += x % 10;
        x /= 10;
    }
    while (y) {
        b *= y % 10;
        y /= 10;
    }
    if (a < b) swap(a, b);
    printf("%d%d\n", a, b);

    return 0;
}

RC-v6 拼瓷砖

cz.JPG

对照设计师给出的瓷砖拼接图案,请你统计一下需要多少种不同的瓷砖各多少块?

这里每块瓷砖都是单一颜色的正方形,每种颜色用一个 { 0-9a-zA-Z } 集合中的字符来表示。当设计图中有一方块颜色的面积为 L×L 时,我们将用一整块边长为 L 的正方形瓷砖来填充,而不会选用较小的同色瓷砖来拼接。此外,为了避免多解的情况,我们规定必须按照从上到下、从左到右的顺序贴瓷砖(参见样例解释),瓷砖不可重叠,并且要求每一步选用的瓷砖的面积尽可能大。

输入格式:

输入首先在第一行中给出两个不超过 10310^3 的正整数 NM,对应整面墙的高和宽。随后 N 行,每行给出 M 个字符,对应这一行的颜色分布。

输出格式:

首先在第一行输出不同瓷砖的种类数 K。随后 K 行,每行按格式

color = C; size = L; amount = T

输出一种瓷砖的信息。其中 C 是表示颜色的字符,L 是正方形的边长,T 是这种瓷砖需要的数量。

瓷砖按照其颜色的升序输出,同色的瓷砖按照其边长的升序输出。

输入样例:

6 6
aaadee
aacbee
deccda
caccbe
ddecbb
ddadbb

输出样例:

10
color = a; size = 1; amount = 4
color = a; size = 2; amount = 1
color = b; size = 1; amount = 2
color = b; size = 2; amount = 1
color = c; size = 1; amount = 3
color = c; size = 2; amount = 1
color = d; size = 1; amount = 4
color = d; size = 2; amount = 1
color = e; size = 1; amount = 3
color = e; size = 2; amount = 1

样例解释:

下图中的数字给出了贴瓷砖的顺序。

sample.JPG

解题:模拟

思路

把每一个还没遍历过的格子当成瓷砖左上角,向右向下匹配。

代码
#include <cstdio>
#include <map>

using namespace std;

const int N = 1e3 + 10;
int n, m;
char g[N][N];
map<char, map<int, int>> mp;
int cnt;

bool check(int x, int y, int k) {
    char c = g[x][y];
    if (x + k - 1 >= n || y + k - 1 >= m) return false;
    for (int i = x; i < x + k; ++i) {
        if (g[i][y + k - 1] != c) return false; 
    }
    for (int j = y; j < y + k; ++j) {
        if (g[x + k - 1][j] != c) return false; 
    }
    return true;
}

void mark(int x, int y, int k) {
    for (int i = x; i < x + k; ++i) {
        for (int j = y; j < y + k; ++j) {
            g[i][j] = '#';
        }
    }
}

int main() {
    scanf("%d%d\n", &n, &m);
    for (int i = 0; i < n; ++i) scanf("%s", g[i]);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (g[i][j] == '#') continue;
            int k = 1;
            while (check(i, j, k + 1)) ++k;
            char& c = g[i][j];
            ++mp[c][k];
            mark(i, j, k);
        }
    }
    for (auto pr : mp) cnt += pr.second.size();
    printf("%d\n", cnt);
    for (auto pr1 : mp) {
        for (auto pr2 : pr1.second) {
            printf("color = %c; size = %d; amount = %d\n", pr1.first, pr2.first, pr2.second);
        }
    }

    return 0;
}

RC-v7 燕归来

无可奈何花落去,似曾相识燕归来。

研究燕子随季节迁徙的科学家们,给一批燕子做了标记,每只被标记的燕子有一个独特的编号。等它们归来时,再根据标记检查有哪些燕子没有回来,同时有哪些燕子是从别处飞来的,身上带了别人家的标记。

输入格式:

输入首先给出飞走的燕子的信息:在第一行给出不超过 10510^5 的正整数 N,随后 N 行,每行给出一只飞走的燕子的编号。题目保证编号不重复。

随后是飞回的燕子的信息,首先是一个不超过 10510^5 的非负整数 M,随后 M 行,每行给出一只飞回的燕子的编号。题目保证编号不重复。

编号为长度不超过 8 的、由英文字母和数字组成的字符串。

输出格式:

首先输出没有回来的燕子的信息,格式为:

Missing: X
ID[1]
...
ID[X]

其中 X 为没有回来的燕子的数量,ID[i]i = 1, …, X)为按字典序递增输出的这些燕子的编号。

然后输出新增燕子的信息,格式同上,只是把 Missing 换成 New

如果 X 为零,则对应情况下输出 All Back(都回来了)或 All Known(都认识)。

输入样例 1:

5
CN009
CN018
CN001
CN005
CN000
6
US981
CN018
CN000
AUS83
CN005
RU996

输出样例 1:

Missing: 2
CN001
CN009
New: 3
AUS83
RU996
US981

输入样例 2:

5
CN009
CN018
CN001
CN005
CN000
5
CN018
CN001
CN005
CN009
CN000

输出样例 2:

All Back
All Known

解题:哈希表 模拟

思路

模拟+哈希表去重。

代码
#include <iostream>
#include <unordered_set>
#include <set>

using namespace std;

int n, m;
unordered_set<string> gone, bs;
set<string> ms, ns;
string s;
int x;

int _ = []() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    return 0;
}();

int main() {
    cin >> n;
    while (n--) {
        cin >> s;
        gone.insert(s);
    }
    cin >> m;
    while (m--) {
        cin >> s;
        if (gone.find(s) != gone.end()) bs.insert(s);
        else ns.insert(s);
    }
    for (string ss : gone) {
        if (bs.find(ss) == bs.end()) ms.insert(ss);
    }
    if (!ms.size()) cout << "All Back" << '\n';
    else {
        cout << "Missing: " << ms.size() << '\n';
        for (string ss : ms) cout << ss << '\n';
    }
    if (!ns.size()) cout << "All Known" << '\n';
    else {
        cout << "New: " << ns.size() << '\n';
        for (string ss : ns) cout << ss << '\n';
    }

    return 0;
}
0

评论区