Codeforces 158A Next Round题解lambda函数及最后一行逻辑详解
Codeforces 158A 题极简Python代码逐解
前置背景(158A题意核心)
参赛选手得分按非递增顺序给出,晋级要求同时满足两个条件:
- 得分严格大于0
- 得分不低于第k名选手的得分
求最终晋级总人数。
代码逐行解释
i=lambda:map(int,input().split())
- 这里的
lambda是Python中快速定义匿名小函数的语法,这段代码等价于写了一个普通函数:def i(): return map(int, input().split()) - 作用是把重复的输入逻辑封装,省得每次都要写
map(int, input().split()),调用i()就能直接读取一行输入,按空格拆分后转成整数迭代器。
n,k=i()
- 调用上面封装的输入函数,读取题目第一行输入的两个整数:
n是总参赛人数,k是晋级参照的名次。
l=list(i())
- 再次调用输入函数,读取题目第二行输入的n个整数,转成列表
l,就是按非递增顺序排列的所有选手得分。
print(sum(v>=max(1,l[k-1])for v in l))
这行是核心逻辑,拆成三部分理解:
- 计算晋级阈值
max(1,l[k-1])- Python列表索引从0开始,所以第k名的得分是
l[k-1] - 用
max(1, 第k名得分)是把两个晋级条件合并成一个阈值:如果第k名得分是0,阈值就变成1,刚好排除所有0分选手,完全符合题目要求。
- Python列表索引从0开始,所以第k名的得分是
- 生成器表达式
v>=阈值 for v in l- 遍历所有选手得分
v,逐个判断是否满足≥阈值,满足返回True,不满足返回False - Python中
True等价于整数1,False等价于整数0
- 遍历所有选手得分
- sum()求和
- 把所有判断结果的1和0加总,得到的总和就是满足晋级条件的总人数,直接打印即可。
示例验证
举个常见测试用例:
输入:
8 5 10 9 8 7 7 7 3 0
- 第k=5名的得分是
l[4]=7,阈值为max(1,7)=7 - 遍历所有得分,≥7的共有6个,最终输出6,和预期结果一致。
内容的提问来源于stack exchange,提问作者astron
相关产品推荐
相关产品推荐

