NOC2023 复赛初中组
1. 第⼆个字符
题⽬描述
给定⼀个字符串 ,请输出这个字符串中的第⼆个字符。
输⼊描述
共⼀⾏
⼀个字符串 ,⾄少有 2个字符
输出描述
共⼀⾏
这个字符串的第⼆个字符
样例输⼊
编程真有趣!
样例输出
程
解题思路:
1. 使⽤ input() 命令输⼊⼀个字符串
2. 通过索引访问第⼆个字符 ,注意字符串索引从 0开始
1 s = input () # 输⼊
2 print (s[ 1]) # 第⼆个字符索引 是 1
2. 勾股定理
勾股定理是⼀个⼏何定理 ,它是指直角三角形的两条直角边的平⽅和等于斜边的平⽅ 。我们可以⽤它
的逆定理来判断给定三条边⻓的三角形是否为直角三角形。
例如 ,按照从⼩到⼤的顺序给定三角形的三条边⻓ ,分别为 a、 b、 c,如果满⾜ a²+b ²=c ²,就说明这个
三角形是直角三角形 ,否则就不是直角三角形。
按照从⼩到⼤的顺序给定三角形的三条边⻓ a、 b、 c,请你判断它是否为直角三角形。如果是直角三角
形 ,就输出 “ Yes ” ,否则输出 “ No ” 。
【输⼊描述】
共⼀⾏
三个整数 a、 b、 c,两数之间⽤逗号隔开
【输出描述】
共⼀⾏
Yes 或者 No
【输⼊样例】
3,4,5
【输出样例】
Yes
解题思路:
输⼊数据 ,得到整数列表
判断:第⼀个数的平⽅ +第⼆个数的平⽅ =第三个数的平⽅ 是否成⽴
1 li = [int (i) for i in input ().spli t( ',' )]
2 a = li[ 0]
3 b = li[ 1]
4 c = li[ 2]
5 if a ** 2 + b ** 2 == c ** 2:
6 print ('Yes' )
7 else :
8 print ('No' )
3. 剪⼑⽯头布
题⽬描述
剪⼑⽯头布是⼀种猜拳游戏 ,规则简单明了 ,单次 玩法⽐拼运⽓ ,多回合玩法⽐拼⼼理博弈 ,深受世
界⼈⺠喜爱。
游戏规则:剪⼑剪布 ,布包⽯头 ,⽯头砸剪⼑。
现在需要你写⼀个程序来判断剪⼑⽯头布游戏的结果。
输⼊描述
共 N+1 ⾏
第⼀⾏ ,⼀个整数 N( 1<= N <= 100 ) , 表 ⽰⼀共进⾏了 N次游戏
接下来 N⾏ ,每⾏包含两个字符串 ,表⽰游戏参与者 Player1 和 Player2 的选择( Scissors 、 Rock 或者
Paper ) , 字符串之间以空格隔开
提⽰: Scissors 是剪⼑ , Rock 是⽯头 , Paper 是布
输出描述
共 N⾏
每⾏对应⼀个胜利者( Player1 或者 Player2 ) , 如果出现平局情况 ,则输出 Tie
样例输⼊
3
Scissors Scissors
Paper Rock
Scissors Rock
样例输出
Tie
Player 1
Player 2
解题思路:
分情况讨论:
1. 两者相同 ,则平局
2. 玩家 1⽯头 ,玩家 2剪⼑; 玩家 1剪⼑ ,玩家 2布;玩家 1布 ,玩家 2⽯头;这三种 情况均为玩家 1获胜
3. 其他情况 ,玩家 2获胜
1 n = int (input ()) # 输⼊游戏次数 n
2 for i in range (n):
3 s1, s2 = input ().split() # 输⼊ 游戏参与者 Player1 和 Player2 的选择
4 if s1 == s2: # 平局
5 print ("Tie" )
6 elif (s1 == "Rock" an d s2 == "Scissors" ) or (s1 == "Scissors" and s2 ==
"Paper" ) or (s1 == "Paper" and s2 == "Rock" ): # Player1 获胜
7 print ("Player1" )
8 else : # Player2 获胜
9 print ("Player2" )
4. 空⼼数字矩形
题⽬描述
给定⼀个正整数 n(2 < n< 10) ,打印由数字 n和空格组成的空⼼矩形。
输⼊描述
共⼀⾏
⼀个正整数 n(2 < n<10)
输出描述
共 n⾏
⼀个由数字 n和空格组成的空⼼矩形 ,要求⾏和列都是 n个数字
样例输⼊
3
样例输出
333
3 3
333
解题思路:
分⾏讨论:
先打印第⼀⾏ ,以⼀个数字⼀个空格为⼀组 ,共重复 n次
接下来打印第 2到 n-1⾏ ,所以重复执⾏ n-2次 ,每⼀⾏包含:⼀个数字 ,( 2*n-3)个空格 ,⼀个数字
最后⼀⾏和第⼀⾏⼀样 ,以⼀个数字⼀个空 格为⼀组 ,共重复 n次
1 n = int (input ()) # 输⼊ n
2 # 打印第⼀⾏
3 print (( str (n) + ' ') * n)
4 # 打印中间 n - 2 ⾏
5 for i in range (n - 2):
6 print (str (n) + ' ' * (2 * n - 3) + str (n))
7 # 打印最后⼀⾏
8 print (( str (n) + ' ') * n)
5. 发苹果
题⽬描述
今天班⾥发苹果 ,每⼈⼀个。有 N(3 <= N <= 20) 个同学没来 ,但只剩下 N-1 个苹果了。班⻓⼩刚决定放
学以后把这 N-1 个苹果发给 N-1 个同学 ,他想的办法是 :必须经过第⼀个同学和第 N个同学的家 ,给他
俩发放苹果;剩余的同学中 ,跳过⼀个同学 ,不给他发苹果 ,使得⾛的总路线最短。
依次给定第⼀个同学到第 N个同学的家的位置坐标( ⽤⼀对数字 x和 y表⽰ ), 请你计算 ⼩刚⾛的最短总
路线。
提⽰: 第 i个同学家与第 j个同学家之间的路线⻓度为 |xi -xj| + |yi -yj| 。
输⼊描述
共 N+1 ⾏
第⼀⾏ ,整数 N(3 <= N <= 20)
第⼆⾄ N+1 ⾏ ,每⾏⼀个坐标 x和 y, x和 y均为整数 ,中间⽤空格分隔 ,表 ⽰每个同学的家的位置坐标
输出描述
共⼀⾏
⼀个整数 ,表⽰最短路线⻓度
样例输⼊
4
00
83
11 -1
10 0
样例输出
14
解题思路:
1. 先计算从第 1个同学家依次经过每⼀个同学家到达第 N 个同学家的总距离
2. 枚举去掉第 2到第 N -1个同学家的距离 ,对
NOC2023初中组Python复赛真题-含答案,2023年NOC编程马拉松Python初中组复赛真题含答案