使用二元排序键,先按成绩降序,再按姓名字典序升序排列。
OJ: noi_openjudge
题目 ID: ch0110-03
难度:入门
标签:排序字符串python
创建: 2026-07-30 23:01
更新: 2026-07-31 11:59
后置题目
roj 3569[NOIP2009-普及] 分数线划定A 教的「排序键写成 (-分数, 姓名),负号把降序变升序」被 B 逐个迁移为按 (-成绩, 报名号) 排序,再用这一次排序同时供取分数线与输出roj 1180分数线划定B 的排序步骤直接复用 A 教的「负号翻转成降序 + 元组承载次级键」这一两级排序键写法,只是把姓名换成报名号,再在其上叠加取第 ⌊m×150/100⌋ 名定线、按分数统计同分者并输出前缀的额外流程。noi_openjudge ch0110-04奖学金B 直接复用 A 的「多级排序键用元组加负号转降序」这一步写法,只是从两级规则扩到三级(总分降序、语文降序、学号升序)noi_openjudge ch0110-05分数线划定B 的排序直接复用 A 的「(-分数, 次键) 元组键」这一步:负号让分数降序、报名号升序做次键,一条 sort 表达两级规则,再叠加 A 未教的 150% 分数线取第 int(m*1.5) 名成绩与不低于线的筛选。luogu P1786帮贡排序B 复用 A 的负号改降序、多关键字压成一条元组排序键的写法,扩成职位高低、等级、输入顺序三级规则
题意
将成绩单按分数从高到低排列;同分时姓名字典序较小的学生在前。
思路
Python 的元组会从左到右比较。排序键写成 (-分数, 姓名):负号把分数的升序改为降序,姓名仍按默认字典序升序比较。这样一条 sort 就表达了两级规则。
代码
Python代码
python
student_count = int(input())
students = [input().split() for _ in range(student_count)]
# 元组 key 先比较负分数,再比较姓名,因此正好符合题目的两级规则。
students.sort(key=lambda student: (-int(student[1]), student[0]))
for name, score in students:
print(name, score)C++代码
cpp
#include <cstdio>
struct ren {
char name[100];
int c;
};
ren a[20];
int n;
int main(){
scanf("%d",&n);
int i,j;
for(i = 1;i<=n;i++){
scanf("%s",a[i].name);
scanf("%d",&a[i].c);
}
for(i=1;i<=n-1;i++)
for(j=1;j<=n-i;j++){
if( a[j].c > a[j+1].c){
ren t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
for(i=n;i>=1;i--){
printf("%s %d\n",a[i].name,a[i].c);
}
return 0;
}复杂度
时间复杂度为
总结
多关键字排序的关键是把每层规则依次写进元组键中。