2022-GPLT团体程序设计天梯赛L1题解
L1-081 今天我要赢(5分)
2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。
输入格式:
本题没有输入。
输出格式:
输出分 2 行。在第一行中输出 I'm gonna win! Today!
,在第二行中用 年年年年-月月-日日
的格式输出比赛当天的日期。已知比赛的前一天是 2022-04-22
。
输入样例:
无
输出样例:
第二行的内容要你自己想一想,这里不给出
I'm gonna win! Today!
这一行的内容我不告诉你…… 你要自己输出正确的日期呀~
代码:
#include <bits/stdc++.h>
using namespace std;
int main () {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cout << "I'm gonna win! Today!" << endl ;
cout << "2022-04-23" << endl ;
return 0 ;
}
L1- 082 种钻石(10分)
2019年10月29日,中央电视台专题报道,中国科学院在培育钻石领域,取得科技突破。科学家们用金刚石的籽晶片作为种子,利用甲烷气体在能量作用下形成碳的等离子体,慢慢地沉积到钻石种子上,一周“种”出了一颗 1 克拉大小的钻石。
本题给出钻石的需求量和人工培育钻石的速度,请你计算出货需要的时间。
输入格式:
输入在一行中给出钻石的需求量 N(不超过 107 的正整数,以微克拉
为单位)和人工培育钻石的速度 v(1≤v≤200,以微克拉/天
为单位的整数)。
输出格式:
在一行中输出培育 N 微克拉钻石需要的整数天数。不到一天的时间不算在内。
输入样例:
102000 130
输出样例:
784
代码:
#include <bits/stdc++.h>
using namespace std;
int n , m ;
int main () {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m ;
cout << (int)n / m << endl ;
return 0 ;
}
L1-083 谁能进图书馆(10分)
为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。
输入格式:
输入在一行中给出 4 个整数:
禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄
这里的禁入年龄线
是指严格小于该年龄的儿童禁止入馆;陪同年龄线
是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 1
和 2
;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线
严格大于 禁入年龄线
。
输出格式:
在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y
,否则输出 年龄-N
,中间空 1 格,行首尾不得有多余空格。
在第二行根据两个询问者的情况输出一句话:
- 如果两个人必须一起进,则输出
qing X zhao gu hao Y
,其中X
是陪同人的编号,Y
是小孩子的编号; - 如果两个人都可以进但不是必须一起的,则输出
huan ying ru guan
; - 如果两个人都进不去,则输出
zhang da zai lai ba
; - 如果一个人能进一个不能,则输出
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 <bits/stdc++.h>
using namespace std;
int n , m , a , b ;
bool mark1 , mark2 ;
int main () {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m >> a >> b ;
//如果年龄小而且无法照顾
mark1 = ( a >= n || ( a < n && b >= m ) ) ;
mark2 = ( b >= n || ( b < n && a >= m ) ) ;
if ( mark1 ) cout << a << "-Y " ;
else cout << a << "-N " ;
if ( mark2 ) cout << b << "-Y" << endl ;
else cout << b << "-N" << endl ;
if ( a >= n && b >= n ) cout << "huan ying ru guan" << endl ;
if ( a >= m && b < n ) cout << "qing 1 zhao gu hao 2" << endl ;
if ( b >= m && a < n ) cout << "qing 2 zhao gu hao 1" << endl ;
if ( a < n && b < n ) cout << "zhang da zai lai ba" << endl ;
if ( a >= n && a < m && b < n ) cout << "1: huan ying ru guan" << endl ;
if ( b >= n && b < m && a < n ) cout << "2: huan ying ru guan" << endl ;
return 0 ;
}
L1-084 拯救外星人(10分)
你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。
本题就请你写程序模仿外星人的行为。
输入格式:
输入在一行中给出两个正整数 A 和 B。
输出格式:
在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。
输入样例:
3 6
输出样例:
362880
代码:
#include <bits/stdc++.h>
using namespace std;
long long n , m , k = 1 ;
int main () {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m ;
for ( int i = 1 ; i <= n + m ; i ++ ) {
k *= i ;
}
cout << k << endl ;
return 0 ;
}
L1-085 试试手气(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
代码:
#include <bits/stdc++.h>
using namespace std;
int n , m , A [ 6 ] ;
bool Array [ 6 ] [ 6 ] ;
int main () {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
for ( int i = 0 ; i < 6 ; i ++ ) {
cin >> m ;
Array [ i ] [ m - 1 ] = true ;
}
cin >> n ;
for ( int i = 0 ; i < n ; i ++ ) {
for ( int j = 0 ; j < 6 ; j ++ ) {
for ( int k = 5 ; k >= 0 ; k -- ) {
if ( !Array [ j ] [ k ] ) {
if ( i == n - 1 ) A [ j ] = k + 1 ;
Array [ j ] [ k ] = true ;
break ;
}
}
}
}
for ( int i = 0 ; i < 6 ; i ++ ) {
if ( i < 5 )
cout << A [ i ] << " " ;
else
cout << A [ i ] << endl ;
}
return 0 ;
}
L1-086 斯德哥尔摩火车上的题(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
代码:
#include <bits/stdc++.h>
using namespace std;
string str1 , str2 ;
string str ( string S ) {
string s = "";
for ( int i = 1 ; i < S.size() ; i ++ ) {
if ( ( S [ i ] - '0' ) % 2 == ( S [ i - 1 ] - '0' ) % 2 ) {
s += max ( S [ i ] - '0' , S [ i - 1 ] - '0' ) + '0' ;
}
}
return s ;
}
int main ( ) {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> str1 >> str2 ;
if ( str ( str1 ) == str ( str2 ) ) cout << str ( str1 ) << endl ;
else cout << str ( str1 ) << endl << str ( str2 ) << endl ;
return 0 ;
}
L1-087 机工士姆斯塔迪奥(20分)
在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。
你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。
给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。
输入格式:
输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。
接下来 Q 行,每行两个数 T**i,C**i,其中 T**i=0 表示 BOSS 选择的是一整行,T**i=1 表示选择的是一整列,C**i 为选择的行号/列号。行和列的编号均从 1 开始。
输出格式:
输出一个数,表示安全格子的数量。
输入样例:
5 5 3
0 2
0 4
1 3
输出样例:
12
代码:
#include <bits/stdc++.h>
using namespace std;
int N , M , Q , T , C ;
int n , m ;
bool Array0 [ 100005 ] , Array1 [ 100005 ] ;
int main ( ) {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> N >> M >> Q ;
for ( int i = 0 ; i < Q ; i ++ ) {
cin >> T >> C ;
if ( !T ) {
if ( !Array0 [ C ] ) {
Array0 [ C ] = true ;
n ++ ;
}
}
else {
if ( !Array1 [ C ] ) {
Array1 [ C ] = true ;
m ++ ;
}
}
}
cout << ( N - n ) * ( M - m ) << endl ;
return 0 ;
}
L1-088 静静的推荐(20分)
天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
- 只考虑得分不低于 175 分的学生;
- 一共接受 K 批次的推荐名单;
- 同一批推荐名单上的学生的成绩原则上应严格递增;
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?
输入格式:
输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,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 人进入推荐名单。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005 ;
int N , K , S , n , k [ 300 ] , Array [ MAXN ] [ 2 ] ;
int main ( ) {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> N >> K >> S ;
for ( int i = 0 ; i < N ; i ++ ) {
cin >> Array [ i ] [ 0 ] >> Array [ i ] [ 1 ] ;
if ( Array [ i ] [ 0 ] >= 175 && Array [ i ] [ 1 ] >= S ) n ++ ;
else k [ Array [ i ] [ 0 ] ] ++ ;
}
for ( int i = 0 ; i < K ; i ++ ) {
for ( int j = 290 ; j >= 175 ; j -- ) {
if ( k [ j ] ) {
n ++ ;
k [ j ] -- ;
}
}
}
cout << n << endl ;
return 0 ;
}