python 考试题(带答案),python基础试题及答案
NOIP普及练习:瑞士圆题目描述解题思路参考答案测试案例总结
时间限制:1000秒内存限制:128 MB
标题描述
背景
在乒乓球、羽毛球、国际象棋等双人对决的竞技比赛中,最常见的赛制是淘汰制和循环制。前者的特点是
游戏数量少,每一局都很刺激,但几率高。后者的特点是公平,偶然性低,但竞争过程往往非常漫长。
本题介绍的瑞士循环赛制,因1895年在瑞士举行的国际象棋比赛中首次使用而得名。可以算是淘汰赛和循环赛的折中,既保证了比赛的稳定性,又使得赛程不会太长。
描述:编号为1~2N的2*N名选手进行R轮比赛。每轮比赛开始前和所有比赛结束后,按照总成绩从高到低对选手进行排名。选手的总成绩是第一轮开始前的初始成绩加上其参加过的所有比赛的成绩之和。总分相同,约定数较小的选手排名第一。
每轮的比赛安排与该轮开始前的排名有关:第1和第2,第3和第4,…,2K第1和2K,…,2n第1和2n,各有一场比赛。每局胜者得1分,败者得0分。也就是说,除了第一轮,其他轮次的比赛安排是无法提前确定的,而是取决于选手在历届比赛中的表现。
现在,给定每个玩家的初始分数和力量值,试着计算出R轮比赛后排名Q的玩家的数量。假设我们选手的体力值不一样,每次比赛总是体力值高的一方获胜。
输入
输入文件名为swiss.in.
输入的第一行是三个正整数N,R,Q,每两个数之间用空格隔开,表示有2*N个选手,R轮比赛,以及我们关心的排名Q。
第二行是2N个非负整数s1,s2,…,s 2N,每两个数之间用空格隔开,其中si代表编号为I的选手的初始得分,第三行是2N。
正整数w1,w2,…,w2N,每两个数之间用空格隔开,其中wi代表编号为I的玩家的实力值。
输出
输出文件名是swiss.out
只输出一行,其中包含一个整数,即R轮结束后排名Q的玩家的编号。
样例输入
2 4 2
7 6 6 7
10 5 20 15样例输出
1提示
[示例说明]
【数据范围】
1N100;对于30%的数据;
50%数据1n10000;
对于100%数据,1 N 10万,1 R 50,1 Q 2N,0 S1,S2,…,S2n 10 8,1 W1,W2,…,W2n 10 8。
来源
全国各省信息学奥林匹克竞赛在线测评系统
解决问题的思路每个玩家都有三条信息:人数,分数,能力值。用球员名单记住每个球员的信息。列表元素有三个数据项,第一个是数字,第二个是分数,第三个是能力值。一轮比赛下来,评分项会有变化。每轮比赛,先确定谁和谁比赛,然后根据能力值计算每个选手的得分。重复R轮,可以得到每个玩家的最终得分。如何确定谁和谁比较?答案是,按照最高分到最低分,相同分数到最低数对球员名单进行排序。排序后,指数为i (i=0,2,4,…,2*N-2)的玩家与指数为i 1的玩家竞争。最后选手名单按照分数从高到低排序,分数相同的按照数字从小到大排序。索引Q-1的列表元素中的第一项是最终结果。参考答案N,R,Q=[int(s) for s in input()。split()]scores=[int(s)for s in input()。split()]levels=[int(s)for s in input()。split()]玩家=[[i 1,Scores [I],levels [I]] for I in range (2 * n)] #每个玩家对于r in range(R)的数量、得分和能力:#根据得分从高到低,将得分相同的玩家列表按数字从小到大排序。players.sort() #按数字从小到大排序PLAYERS . Sort(key=lambda p:p[1],reverse=true) #在范围(0,2*N,2)内对I进行排序:如果players[i][2] players[i 1][2]:第1和第2位比,第3和第4位比,…PLAYERS[I][1]=1 LSE:PLAYERS[I 1][1]=1 PLAYERS。SORT()Rank players . SORT(key=lambda p:p[1],reverse=true)# Rank print(players[Q-1][0])根据测试用例标题描述,给出的测试案例已经涵盖了以下几种情况:分数相同,数字最小的先来。
N=1的边界情况。样例输入
1 1 1
5 9
10 15样例输出
2
分数总是不一样的情况。样例输入
2 4 2
3 2 5 4
10 5 20 15样例输出
四
根据题目描述中给出的测试用例,可以扩展三个测试用例,分别输出排名1的玩家数、排名3的玩家数和排名4的玩家数。因为扩展成本低,不容易出错,值得使用。
总结Python语言的官方手册推荐,按照键组合【主关键字和次关键字】对列表进行排序,分两步进行:(1)按照次关键字对列表进行排序;(2)按主关键字对列表进行排序。排序的时间开销不是两种排序的时间开销之和。使用标题描述给出的测试用例扩展来生成新的测试用例是一个很好的实践。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。