写点什么

2021 团体程序设计天梯赛 - 部分题解

用户头像
玄兴梦影
关注
发布于: 2021 年 04 月 26 日
2021团体程序设计天梯赛-部分题解

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/type/7

L1-073 人与神(5 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652352

跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,递归的是神)。本题就请你直接在屏幕上输出这句话。

输入格式:

本题没有输入。

输出格式:

在一行中输出 To iterate is human, to recurse divine.

输入样例:

复制代码

输出样例:

To iterate is human, to recurse divine.
复制代码

题解:

  • 输出

# include <bits/stdc++.h>
using namespace std;
int main(){ cout << "To iterate is human, to recurse divine." << endl; return 0;}
复制代码

L1-074 两小时学完 C 语言 (5 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652353



知乎上有个宝宝问:“两个小时内如何学完 C 语言?”当然,问的是“学完”并不是“学会”。

假设一本 C 语言教科书有 N 个字,这个宝宝每分钟能看 K 个字,看了 M 分钟。还剩多少字没有看?

输入格式:

输入在一行中给出 3 个正整数,分别是 N(不超过 400 000),教科书的总字数;K(不超过 3 000),是宝宝每分钟能看的字数;M(不超过 120),是宝宝看书的分钟数。

题目保证宝宝看完的字数不超过 N。

输出格式:

在一行中输出宝宝还没有看的字数。

输入样例:

100000 1000 72
复制代码

输出样例:

28000
复制代码

题解:

  • 简单计算

# include <bits/stdc++.h>
using namespace std;
int main(){ int n, k, m; cin >> n >> k >> m; cout << n - k * m << endl; return 0;}
复制代码

L1-075 强迫症 (10 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652354

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808
复制代码

输出样例 1:

1998-08
复制代码

输入样例 2:

0510
复制代码

输出样例 2:

2005-10
复制代码

输入样例 3:

196711
复制代码

输出样例 3:

1967-11
复制代码

题解:

  • 字符串处理,判断

# include <bits/stdc++.h>
using namespace std;
int main(){ string str; cin >> str; int len = str.length(); if (len == 4) { if (str[0] < '2') { cout << "20" << str[0] << str[1] << "-" << str[2] << str[3] << endl; } else if (str[0] == '2' ) { if (str[1] < '2') { cout << "20" << str[0] << str[1] << "-" << str[2] << str[3] << endl; } else { cout << "19" << str[0] << str[1] << "-" << str[2] << str[3] << endl; } } else { cout << "19" << str[0] << str[1] << "-" << str[2] << str[3] << endl; } } else { cout << str[0] << str[1] << str[2] << str[3] << "-" << str[4] << str[5] << endl; } return 0;}
复制代码

L1-076 降价提醒机器人 (10 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652355

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

输入格式:

输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M

接下来 N 行,每行有一个实数 Pi​​(−1000.0<Pi​​<1000.0),表示一条价格记录。

输出格式:

对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位。

输入样例:

4 9998.097.0100.298.9
复制代码

输出样例:

On Sale! 98.0On Sale! 97.0On Sale! 98.9
复制代码

题解:

  • 判断

# include <bits/stdc++.h>
using namespace std;
int main(){ int n; double m; cin >> n >> m; while (n--) { double p; cin >> p; if (p < m) printf("On Sale! %.1lf\n", p); } return 0;}
复制代码

L1-077 大笨钟的心情 (15 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652356



有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……

本题就请你替大笨钟写一个程序,根据心情自动输出回答。

输入格式:

输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。

随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。

输出格式:

对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes,否则输出 心情指数 No

输入样例:

80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63177315-1
复制代码

输出样例:

52 Yes20 No50 No58 Yes
复制代码

题解:

  • 数组的应用、判断

# include <bits/stdc++.h>
using namespace std;
int main(){ int h[25]; for (int i = 0; i < 24; i++) cin >> h[i]; int p; while (cin >> p && p > -1 && p < 24) { if (h[p] > 50) cout << h[p] << " Yes" << endl; else cout << h[p] << " No" << endl; } return 0;}
复制代码

L1-078 吉老师的回归 (15 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652357

曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦!

为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来,如:Problem A: Print "Hello world!"

众所周知,吉老师的竞赛水平非常高超,你可以认为他每道题目都会做(事实上也是……)。因此,吉老师会按照顺序看题并做题。但吉老师水平太高了,所以签到题他就懒得做了(浪费时间),具体来说,假如题目的字符串里有 qiandao 或者 easy(区分大小写)的话,吉老师看完题目就会跳过这道题目不做。

现在给定这次天梯赛总共有几道题目以及吉老师已经做完了几道题目,请你告诉大家吉老师现在正在做哪个题,或者吉老师已经把所有他打算做的题目做完了。

提醒:天梯赛有分数升级的规则,如果不做签到题可能导致团队总分不足以升级,一般的选手请千万不要学习吉老师的酷炫行为!

输入格式:

输入第一行是两个正整数 N,M (1≤MN≤30),表示本次天梯赛有 N 道题目,吉老师现在做完了 M 道。

接下来 N 行,每行是一个符合题目描述的字符串,表示天梯赛的题目内容。吉老师会按照给出的顺序看题——第一行就是吉老师看的第一道题,第二行就是第二道,以此类推。

输出格式:

在一行中输出吉老师当前正在做的题目对应的题面(即做完了 M 道题目后,吉老师正在做哪个题)。如果吉老师已经把所有他打算做的题目做完了,输出一行 Wo AK le

输入样例 1:

5 1L1-1 is a qiandao problem.L1-2 is so...easy.L1-3 is Easy.L1-4 is qianDao.Wow, such L1-5, so easy.
复制代码

输出样例 1:

L1-4 is qianDao.
复制代码

输入样例 2:

5 4L1-1 is a-qiandao problem.L1-2 is so easy.L1-3 is Easy.L1-4 is qianDao.Wow, such L1-5, so!!easy.
复制代码

输出样例 2:

Wo AK le
复制代码

题解:

  • 字符串处理,字符串查找、判断

  • 应用 string 的 find 函数可以简便过程

# include <bits/stdc++.h>
using namespace std;
int main(){ int n, m, cnt = 0; cin >> n >> m; getchar(); string resStr, str; while (n--) { getline(cin, str); int a = str.find("qiandao"); int b = str.find("easy"); if (a == -1 && b == -1) { if (cnt == m) resStr = str; cnt++; } } if (m >= cnt) cout << "Wo AK le" << endl; else cout << resStr << endl; return 0;}
复制代码

L1-079 天梯赛的善良 (20 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652358

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。

于是命题组首先将编程能力划分成了 10​6​​ 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

输入格式:

输入在第一行中给出一个正整数 N(≤2×10​4​​),即参赛学生的总数。随后一行给出 N 个不超过 10​6​​ 的正整数,是参赛学生的能力值。

输出格式:

第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

1086 75 233 888 666 75 886 888 75 666
复制代码

输出样例:

75 3888 2
复制代码

题解:

  • 数组,循环

  • 注意最小值和最大值有可能相等

# include <bits/stdc++.h>
using namespace std;
int main(){ int n, minValue = 1000010, maxValue = -1, minCnt = 0, maxCnt = 0; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; minValue = min(minValue, a[i]); maxValue = max(maxValue, a[i]); } for (int i = 0; i < n; i++) { if (minValue == a[i]) minCnt++; if (maxValue == a[i]) maxCnt++; } cout << minValue << " " << minCnt << endl; cout << maxValue << " " << maxCnt << endl; return 0;}
复制代码

L1-080 乘法口诀数列 (20 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652359

本题要求你从任意给定的两个 1 位数字 a​1​​ 和 a​2​​ 开始,用乘法口诀生成一个数列 {an​​},规则为从 a​1​​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a​1​​、a​2​​ 和 n,满足 0≤a​1​​,a​2​​≤9,0<n≤10​3​​。

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10
复制代码

输出样例:

2 3 6 1 8 6 8 4 8 4
复制代码

样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

题解:

  • 形势有点类似斐波那契数列循环的方式

  • 如果两个数相乘大于 9 那么需要分解

# include <bits/stdc++.h>
using namespace std;
int main(){ int a1, a2, n, a[1010]; cin >> a1 >> a2 >> n; int l = 0; a[0] = a1; a[1] = a2; for (int i = 2; i < n; i++) { int t = a[i -1] * a[i -2]; if (i + l > n) break; if (t < 10) { a[i + l] = t; } else { a[i +l] = t / 10 % 10; a[i + l + 1] = t % 10; l++; } } for (int i = 0; i < n; i++) { cout << a[i]; if (i != n - 1) cout << " "; } return 0;}
复制代码

L2-037 包装机 (25 分)

题目链接:

https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652360

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图 2 显示了顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态。



图 1 自动包装机的结构



图 2 顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态

一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。此外,如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。

现给定一系列按钮操作,请你依次列出流水线上的物品。

输入格式:

输入第一行给出 3 个正整数 N(≤100)、M(≤1000)和 Smax​​(≤100),分别为轨道的条数(于是轨道从 1 到 N 编号)、每条轨道初始放置的物品数量、以及筐的最大容量。随后 N 行,每行给出 M 个英文大写字母,表示每条轨道的初始物品摆放。

最后一行给出一系列数字,顺序对应被按下的按钮编号,直到 −1 标志输入结束,这个数字不要处理。数字间以空格分隔。题目保证至少会取出一件物品放在流水线上。

输出格式:

在一行中顺序输出流水线上的物品,不得有任何空格。

输入样例:

3 4 4GPLTPATAOMSA3 2 3 0 1 2 0 2 2 0 -1
复制代码

输出样例:

MATA
复制代码

题解:

  • 栈的应用、队列的应用

  • 可以用字符串数组+数组字符串位置标记来模拟队列

  • 注意以下事项:

  • 因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落;

  • 如果轨道已经空了,再按对应的按钮不会发生任何事;

  • 如果筐是空的,按 0 号按钮也不会发生任何事。

穆同学提供了栈、队列的做法,详情请见文章:

https://blog.csdn.net/qq_50250854/article/details/116160702

# include <bits/stdc++.h>
using namespace std;
int main(){ int n, m, sMax; stack<char> st; string str[110], resStr; int a[110] = {0}; cin >> n >> m >> sMax; getchar(); for (int i = 1; i <= n; i++) cin >> str[i]; int p; while (cin >> p && p != -1) { if (p == 0) { if (!st.empty()) { resStr += st.top(); st.pop(); } } else if (a[p] < str[p].length()){ if (st.size() >= sMax) { resStr += st.top(); st.pop(); } st.push(str[p][a[p]]); a[p]++; } } cout << resStr << endl; return 0;}
复制代码


发布于: 2021 年 04 月 26 日阅读数: 98
用户头像

玄兴梦影

关注

做一个写诗的程序员。 2018.12.30 加入

一个不是诗人的诗人,不是程序员的程序员。

评论

发布
暂无评论
2021团体程序设计天梯赛-部分题解