资讯详情

2022年团体程序设计天梯赛C++个人题解附带解题思路

文章目录

    • L1-1 今天我要赢 (5 分)
      • 代码
    • L1-2 种钻石 (5 分)
      • 代码
    • L1-3 谁能进图书馆? (10 分)
      • 代码
    • L1-4 拯救外星人 (10 分)
      • 代码
    • L1-5 试试手气 (15 分)
      • 思路
      • 代码
    • L1-6 斯德哥尔摩火车上的题 (15 分)
      • 思路
      • 代码
    • L1-7 机械师姆斯塔迪奥 (20 分)
      • 思路
      • 代码
    • L1-8 静静的推荐 (20 分)
      • 思路
      • 代码
    • L2-1 插松枝 (25 分)
      • 思路
      • 代码
    • L2-2 老板的作息表 (25 分)
      • 思路
      • 代码
    • L2-3 龙龙送外卖 (25 分)
      • 思路
      • 代码
    • L2-4 大众情人 (25 分)
      • 思路
      • 代码
    • L3-1 千手观音 (30 分)
    • L3-2 深度优先搜索和逆序应该不难。 (30 分)
    • L3-3 教科书般的亵渎 (30 分)
    • 未完待续

L1-1 今天我要赢 (5 分)

2018 2018年我们出了一个题目,就是输出2018 我们要赢 2022 年,你要输出的句子变成了我要赢!就在今天!然后在比赛当天的日期签约。

输入格式:

没有输入没有输入。

输出格式:

输出分 2 行。输出第一行 I’m gonna win! Today!,用于第二行 年-月-月-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-月-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日-日- 格式输出比赛当天的日期。已知比赛的前一天是 2022-04-22

输入样例:

输出样例

(想想第二行的内容,这里不给):

I’m gonna win! Today! 我不会告诉你这一行的内容。…… 你必须输出正确的日期~ 

代码

#include<iostream> #define endl '\n' #define ios ios::sync_with_stdio(false) #define tie cin.tie(nullptr),cout.tie(nullptr) using namespace std; void solve() { 
          cout << "I'm gonna win! Today!" << endl;  cout << "2022-04-23" << endl; } int main() { 
          ios, tie;
	solve();
	return 0;
}

L1-2 种钻石 (5 分)

在这里插入图片描述

2019年10月29日,中央电视台专题报道,中国科学院在培育钻石领域,取得科技突破。科学家们用金刚石的籽晶片作为种子,利用甲烷气体在能量作用下形成碳的等离子体,慢慢地沉积到钻石种子上,一周“种”出了一颗 1 克拉大小的钻石。 本题给出钻石的需求量和人工培育钻石的速度,请你计算出货需要的时间。

输入格式:

输入在一行中给出钻石的需求量 N(不超过 107 的正整数,以微克拉为单位)和人工培育钻石的速度 v(1≤v≤200,以微克拉/天为单位的整数)。

输出格式:

在一行中输出培育 N 微克拉钻石需要的整数天数。不到一天的时间不算在内。

输入样例:

102000 130

输出样例:

784

代码

#include<iostream>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
void solve() { 
        
	int n, v; cin >> n >> v;
	cout << n / v << endl;
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-3 谁能进图书馆 (10 分)

为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。

输入格式:

输入在一行中给出 4 个整数: 禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄 这里的禁入年龄线是指严格小于该年龄的儿童禁止入馆;陪同年龄线是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 12;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线 严格大于 禁入年龄线

输出格式:

在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y,否则输出 年龄-N,中间空 1 格,行首尾不得有多余空格。 在第二行根据两个询问者的情况输出一句话:

  1. 如果两个人必须一起进,则输出 qing X zhao gu hao Y,其中 X 是陪同人的编号, Y 是小孩子的编号;

  2. 如果两个人都可以进但不是必须一起的,则输出 huan ying ru guan

  3. 如果两个人都进不去,则输出 zhang da zai lai ba

  4. 如果一个人能进一个不能,则输出 X: huan ying ru guan,其中 X 是可以入馆的那个人的编号。

输入样例 1:

12 18 18 8

输出样例 1:

18-Y 8-Y
qing 1 zhao gu hao 2

输入样例 2:

12 18 10 15

输出样例 2:

10-N 15-Y
2: huan ying ru guan

代码

#include<iostream>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
void solve() { 
        
	int bage, wage; cin >> bage >> wage;
	int a, b; cin >> a >> b;
	if (a > b) { 
        
		if (b >= bage) { 
        
			cout << a << "-Y " << b << "-Y" << endl;
			cout << "huan ying ru guan" << endl;
		}
		else if (b < bage && a >= wage) { 
        
			cout << a << "-Y " << b << "-Y" << endl;
			cout << "qing 1 zhao gu hao 2" << endl;
		}
		else if (a < bage) { 
        
			cout << a << "-N " << b << "-N" << endl;
			cout << "zhang da zai lai ba" << endl;
		}
		else if (b < bage && a < wage) { 
        
			cout << a << "-Y " << b << "-N" << endl;
			cout << "1: huan ying ru guan" << endl;
 		}
	}
	else { 
        
		if (a >= bage) { 
        
			cout << a << "-Y " << b << "-Y" << endl;
			cout << "huan ying ru guan" << endl;
		}
		else if (a < bage && b >= wage) { 
        
			cout << a << "-Y " << b << "-Y" << endl;
			cout << "qing 2 zhao gu hao 1" << endl;
		}
		else if (b < bage) { 
        
			cout << a << "-N " << b << "-N" << endl;
			cout << "zhang da zai lai ba" << endl;
		}
		else if (a < bage && b < wage) { 
        
			cout << a << "-N " << b << "-Y" << endl;
			cout << "2: huan ying ru guan" << endl;
		}
	}
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-4 拯救外星人 (10 分)

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写了“479001600” 这个答案。 本题就请你写程序模仿外星人的行为。

输入格式:

输入在一行中给出两个正整数 A 和 B。

输出格式:

在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。

输入样例:

3 6

输出样例:

362880

代码

#include<iostream>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
void solve() { 
        
	int a, b; cin >> a >> b;
	long long c = 1;
	for (int i = 1; i <= (a + b); i++) { 
        
		c *= i;
	}
	cout << c << endl;
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-5 试试手气 (15 分)

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式:

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

输入样例:

3 6 5 4 1 4
3

输出样例:

4 3 3 3 4 3

样例解释:

这 3 次摇出的结果依次为:
6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3

思路

对于每个骰子,设置一个访问数组,初始数字标记为true,因为每次都摇最大,所以从6开始往前走 n 次,遇到true跳过,否则n减一,n为0时,此时的j则为我们最终摇到的骰子数目

代码

#include<iostream>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int maxn = 10;
int arr[maxn];
int vis[6][maxn];
void solve() { 
        
	for (int i = 0; i < 6; i++) { 
        
		cin >> arr[i];
		vis[i][arr[i]] = true;
	}
	int k; cin >> k;
	for (int i = 0; i < 6; i++) { 
        
		int temp = k, j = 6;
		for (j; j > 0 && temp; j--) { 
        
			if (vis[i][j])continue;
			else { 
        
				vis[i][j] = true;
				temp--;
			}
		}
		cout << j + 1;
		if (i != 5)cout << ' ';
	}
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-6 斯德哥尔摩火车上的题 (15 分)

上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码:

s = ‘’
a = ‘1112031584’
for (i = 1; i < length(a); i++) {
	if (a[i] % 2 == a[i-1] % 2) {
	s += max(a[i], a[i-1])
	}
}
goto_url(‘www.multisoft.se/’ + s)

其中字符串的 + 操作是连接两个字符串的意思。所以这道题其实是让大家访问网站 www.multisoft.se/112358(注意:比赛中千万不要访问这个网址!!!)。 当然,能通过上述算法得到 112358 的原始字符串 a 是不唯一的。本题就请你判断,两个给定的原始字符串,能否通过上述算法得到相同的输出?

输入格式:

输入为两行仅由数字组成的非空字符串,长度均不超过 104,以回车结束。

输出格式:

对两个字符串分别采用上述斯德哥尔摩火车上的算法进行处理。如果两个结果是一样的,则在一行中输出那个结果;否则分别输出各自对应的处理结果,每个占一行。题目保证输出结果不为空。

输入样例 1:

1112031584
011102315849

输出样例 1:

112358

输入样例 2:

111203158412334
12341112031584

输出样例 2:

1123583
112358

思路

将题中给的代码copy下来就行,分别对两次的字符串跑一遍,每次结果一致则输出第一次,不同则都输出。

代码

#include<iostream>
#include<string>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int maxn = 10;
void solve() { 
        
	string a, b;
	cin >> a >> b;
	string c = "";
	int lena = a.size(), lenb = b.size();
	for (int i = 1; i < lena; i++) { 
        
		if (a[i] % 2 == a[i - 1] % 2) { 
        
			c += max(a[i], a[i - 1]);
		}
	}
	cout << c << endl;
	string temp = "";
	for (int i = 1; i < lenb; i++) { 
        
		if (b[i] % 2 == b[i - 1] % 2) { 
        
			temp += max(b[i], b[i - 1]);
		}
	}
	if (c != temp)cout << temp << endl;
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-7 机工士姆斯塔迪奥 (20 分)

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。 你需要处理这个副本其中的一个机制: N × M N×M N×M 大小的地图被拆分为了 $N×M $ 个 $ 1×1$ 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。 给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N , M , Q ( 1 ≤ N × M ≤ 1 0 5 , 0 ≤ Q ≤ 1000 ) N,M,Q (1≤N×M≤10^{5},0≤Q≤1000) N,M,Q(1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。 接下来 Q 行,每行两个数 Ti,Ci,其中 Ti=0 表示 BOSS 选择的是一整行,Ti=1 表示选择的是一整列,Ci 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12

思路

没减少一次行则对于的n减一,列则对应的m减一。注意可能会给出相同的行列。

代码

#include<iostream>
#define endl '\n'
#define ios ios::sync_with_stdio(false)
#define tie cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int maxn = 1e5 + 5;
int vis[2][maxn];
void solve() { 
        
	long long n, m, q;
	cin >> n >> m >> q;
	while (q--) { 
        
		int t, c; 
		cin >> t >> c;
		if (t) { 
        
			if (!vis[t][c]) { 
        
				vis[t][c] = true;
				m--;
			}
		}
		else { 
        
			if (!vis[t][c]) { 
        
				vis[t][c] = true;
				n--;
			}
		}
	}
	cout << n * m << endl;
}
int main() { 
        
	ios, tie;
	solve();
	return 0;
}

L1-8 静静的推荐 (20 分)

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:

  • 只考虑得分不低于 175 分的学生;
  • 一共接受 K 批次的推荐名单;
  • 同一批推荐名单上的学生的成绩原则上应严格递增;
  • 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入格式:

输入第一行给出 3 个正整数: N ( ≤ 1 0 5 ) N(≤10^{5}) N(≤105)为参赛学生人数, K ( ≤ 5 × 1 0 3 ) K(≤5×10^{3}) K(≤5×103)为企业接受的推荐批次, S ( ≤ 100 ) S(≤100) S(≤100)为该企业的 PAT 面试分数线。

随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。

输出格式:

在一行中输出静静姐最多能向企业推荐的学生人数。

输入样例:

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

输出样例:

8

样例解释:

第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。

思路

构建结构体,将结构体按照先rank分数再pta分数排序。设置一个分数访问数组vis,每次进来一个未出现的分数则推荐,出现一个已经出现过的分数则判断该分数的pta分数是否符合要求。循环 k 次即可。 注意每次将没有推荐的放进另一个数组,否则超时。这里我用的循环数组。

代码

#include<iostream>
#include<algorithm>
#include<utility>
#include<vector&

标签: ba附带连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台