侧边栏壁纸
博主头像
GabrielxD

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

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

目 录CONTENT

文章目录

【算法竞赛】2023 睿抗机器人开发者大赛CAIP-编程技能赛-高职组(省赛)

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

RC-v1 好之者不如乐知者

知之者不如好之者,好之者不如乐知者。热爱编程的你,请直接在屏幕上输出这句话:

How Can We Live a Joyful Life
Without Programming

输入格式:

本题没有输入。

输出格式:

如题面所示,输出分两行。注意没有标点符号,并请注意大小写必须与要求一致。

输入样例:


输出样例:

How Can We Live a Joyful Life
Without Programming

解题:模拟

代码
#include <cstdio>

using namespace std;

int main() {
    puts("How Can We Live a Joyful Life\nWithout Programming");

    return 0;
}

RC-v2 陈依涵的高情商体重计算器

陈依涵同学为了完成老师布置的作业,制作了一些很天才的小软件,并发布给大家使用。这使她一战成名,成为网红程序员。上图的“体重计算器”就是她的著名作品之一 —— 输入你的体重 w,她会根据你的体重很贴心地给出高情商的计算结果,规则如下:

  • 如果用户输入的原始体重不超过 100,那么分两种情况:如果不是 10 的整数倍,就输出抹掉个位数的结果;否则将原始体重的值降低 10 斤输出;
  • 对于超过 100 斤的原始体重,一律输出 100。

本题就请你仿照陈依涵同学的作品也做一个体重计算器。

输入格式:

输入第一行给出一个用户输入的体重值 w,以斤为单位,是一个不超过 500 的正整数。

输出格式:

在一行中输出:Gong xi nin! Nin de ti zhong yue wei: x duo jin,其中的 x 就是按照题面给出的规则计算出的结果。

输入样例 1:

88

输出样例 1:

Gong xi nin! Nin de ti zhong yue wei: 80 duo jin

输入样例 2:

90

输出样例 2:

Gong xi nin! Nin de ti zhong yue wei: 80 duo jin

输入样例 3:

199

输出样例 3:

Gong xi nin! Nin de ti zhong yue wei: 100 duo jin

解题:模拟

代码
#include <cstdio>

using namespace std;

int w;

int main() {
    scanf("%d", &w);
    if (w <= 100) {
        if (w % 10) w -= w % 10;
        else w -= 10;
    } else w = 100;
    printf("Gong xi nin! Nin de ti zhong yue wei: %d duo jin\n", w);

    return 0;
}

RC-v3 环岛自行车赛

环岛自行车赛通常分为 N 个赛段,每个赛段统计运动员们的成绩(即完成该赛段的用时),最后累计得到总成绩。本题就请你根据某个运动员的成绩统计计算其骑行的平均速度。

输入格式:

输入首先在第一行中给出一个正整数 N(≤100),即赛段个数。第二行给出 N 个正整数,即每个赛段的长度(≤10,单位:公里)。第三行给出 N 个正整数,即运动员在每个赛段的用时(≤60,单位:分钟)。

输出格式:

在一行中输出该运动员完成全部比赛的平均速度,单位:公里/小时。输出小数点后 1 位。

输入样例:

4
5 8 3 6
25 31 18 42

输出样例:

11.4

样例解释:

赛道总长度为 5+8+3+6 = 22(公里);

运动员总用时为 25+31+18+42 = 116(分钟)= 116/60 (小时);

平均速度为 22/(116/60) = 11.4(公里/小时)。

解题:模拟

代码
#include <cstdio>

using namespace std;

int n, s1, s2, x;

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &x);
        s1 += x;
    }
    for (int i = 0; i < n; ++i) {
        scanf("%d", &x);
        s2 += x;
    }
    printf("%.1lf\n", s1 * 1.0 / (s2 * 1.0 / 60));

    return 0;
}

RC-v4 两位数加法练习

老师要布置一些练习两位数加法的题目给小朋友,现在请你来帮忙出题。出题的方法是这样的:老师先把一长串数字摆在桌面上,要求你从这个数字串的头、尾各取一个数字。从头取的数字是十位,从尾取的数字是个位,这样拼成一个两位数。例如老师摆好了 12345678,则你应该取出 1 和 8 拼成 18。老师又要求你每拼出两个两位数,就布置一道加法题。则根据老师摆出的 8 个数字,你可以布置 2 道题:“18+27”和“36+45”。

输入格式:

输入在一行中给出一个不超过 100 位的正整数,其中最高位一定不是 0,并且保证这个数字的位数是 4 的倍数。

输出格式:

顺序输出根据老师要求布置的两位数加法题,并给出答案。每行输出一个加法算式,格式如样例。注意不要有任何空格。如果十位是 0,则不要输出这个多余的 0。

输入样例:

102345678910

输出样例:

10+1=11
29+38=67
47+56=103

解题:模拟

代码
#include <cstdio>
#include <cstring>

using namespace std;

char s[110];

int main() {
    scanf("%s", s);
    int n = strlen(s);
    for (int i = 0; i < n / 2; ++i) {
        int a = (s[i] - '0') * 10 + s[n - i - 1] - '0';
        ++i;
        int b = (s[i] - '0') * 10 + s[n - i - 1] - '0';
        printf("%d+%d=%d\n", a, b, a + b);
    }

    return 0;
}

RC-v5 配花束

花店里有 n 种不同的花,每种花有若干枝。现将它们配成花束,要求每种花在每束中各 1 枝,最多可以配成多少束花?

输入格式:

输入第一行给出一个正整数 n(≤10^5),为花店里所有花的种类数。随后一行给出 n 个正整数,分别是每一种花的数量,每个整数都不超过 10^7。

输出格式:

输出按照题面要求最多可以配成的花束的数量。

输入样例:

10
24 35 81 19 47 90 65 51 28 72

输出样例:

19

解题:模拟

思路

最多可以配成的花束的数量即最少的某种花的数量。

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

using namespace std;

int n, mn = 1e9, x;

int main() {
    scanf("%d", &n);
    while (n--) {
        scanf("%d", &x);
        mn = min(x, mn);
    }
    printf("%d\n", mn);

    return 0;
}

RC-v6 数合数

合数是指在大于 1 的整数中除了能被 1 和本身整除外,还能被其他正整数整除的数。与之相对的是质数,而 1 既不属于质数也不属于合数。

现在给定以一个整数的范围 [A,B],要求从这个范围内的整数中删掉几个给定数字的所有倍数,问剩下的数字中还有几个合数?

输入格式:

输入第一行给出 3 个正整数,依次为 ABN,其中 1<A<B<10^5 为给定的整数范围(闭区间的两个端点),1≤N≤10 为给定数字的个数。

第二行给出 N 个不超过 B 的正整数。

输出格式:

对输入的 N 个不超过 B 的正整数,从 [A,B] 中删除每个数的所有倍数,最后在一行中输出 [A,B] 里剩下的数字中有多少个合数。

输入样例:

4 20 3
5 3 8

输出样例:

2

样例解释:

在所有大于等于 4 且小于等于 20 的数字中,删去 5 的倍数 5、10、15、20;删去 3 的倍数 6、9、12、18;删去 8 的倍数 8、16。剩下的数字是 4、7、11、13、14、17、19,其中有 2 个合数 4 和 14。

解题:数学 线性筛

思路

用线性筛把指定范围内的素数筛出来,接着按题目模拟删除给定数字的倍数后统计剩余合数即可。

代码
#include <cstdio>

using namespace std;

const int N = 1e5 + 10;
int primes[N];
int cnt;
bool np[N], deled[N];
int a, b, n;

void sieve(int n) {
    for (int x = 2; x <= n; ++x) {
        if (!np[x]) primes[cnt++] = x;
        for (int i = 0; primes[i] <= n / x; ++i) {
            np[primes[i] * x] = true;
            if (x % primes[i] == 0) break;
        }
    }
}

int main() {
    scanf("%d%d%d", &a, &b, &n);
    sieve(b);
    while (n--) {
        int x; scanf("%d", &x);
        for (int y = a / x * x; y <= b; y += x) {
            deled[y] = true;
        }
        deled[x] = true;
    }
    int cnt = 0;
    for (int x = a; x <= b; ++x) {
        if (!deled[x] && np[x]) ++cnt;
    }
    printf("%d\n", cnt);

    return 0;
}

RC-v7 翻箱倒柜

翻箱倒柜找东西大概是所有人头痛的事情。大部分人类在识别物体的时候,更容易识别颜色而不是大小的差异。所以当我们想从一大堆杂乱堆放的长方体盒子中找到我们需要的盒子时,根据颜色找比根据尺寸找要容易。现在的问题是,我们只知道尺寸不知道颜色…… 所以就要请你从这些盒子的记录中快速找出需要的盒子的颜色。

输入格式:

输入第一行给出一个正整数 N(≤10^5),为盒子的总数。随后 N 行,每行列出一只盒子的长、宽、高、颜色值。再后面是查询数量 K(≤100),随后 K 行,每行给出一个需要查询的盒子的长、宽、高。
这里所有尺寸都是不超过 10^9 的正整数,颜色值按 RRR.GGG.BBB 格式给出,三个分值都在 [0, 255] 区间内。同一行中的数字以空格分隔。
题目保证给出的 N 只盒子的尺寸都不相同,即不存在两只盒子具有相同的长、宽、高。注意:尺寸为 1、2、3 的盒子跟尺寸为 3、2、1的盒子是不同的。

输出格式:

对每个查询的盒子,在一行中按输入相同的格式输出其颜色。如果这个尺寸的盒子不存在,则输出 Not Found

输入样例:

10
15 23 23 000.255.136
12 32 15 255.000.092
29 32 15 000.000.255
15 23 25 255.255.000
10 15 23 000.000.000
12 17 15 255.255.255
15 10 23 023.189.163
29 32 33 233.069.215
9 31 987 179.002.031
40 15 23 230.000.000
6
15 23 23
12 17 15
29 32 33
10 15 15
15 32 12
9 31 987

输出样例:

000.255.136
255.255.255
233.069.215
Not Found
Not Found
179.002.031

解题:哈希表 模拟

思路

哈希表的简单应用。

开三维哈希表或先把盒子编号拼成字符串再开一维哈希表存都可以。

代码1
#include <cstdio>
#include <iostream>
#include <unordered_map>

using namespace std;

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

int n, k;
unordered_map<int, unordered_map<int, unordered_map<int, string>>> mp;

int main() {
    cin >> n;
    int a, b, c;
    string s;
    while (n--) {
        cin >> a >> b >> c >> s;
        mp[a][b][c] = s;
    }
    cin >> k;
    while (k--) {
        cin >> a >> b >> c;
        if (mp.find(a) == mp.end() || mp[a].find(b) == mp[a].end() || mp[a][b].find(c) == mp[a][b].end()) cout << "Not Found\n";
        else cout << mp[a][b][c] << '\n';
    }

    return 0;
}
代码2
#include <cstdio>
#include <iostream>
#include <unordered_map>

using namespace std;

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

int n, k;
unordered_map<string, string> mp;

int main() {
    cin >> n;
    string a, b, c, s;
    while (n--) {
        cin >> a >> b >> c >> s;
        mp[a + "," + b + "," + c] = s;
    }
    cin >> k;
    while (k--) {
        cin >> a >> b >> c;
        s = a + "," + b + "," + c;
        if (mp.find(s) == mp.end()) cout << "Not Found\n";
        else cout << mp[s] << '\n';
    }

    return 0;
}
2

评论区