1031: 排序 [水题]
时间限制: 1 Sec 内存限制: 128 MB提交: 93 解决: 29 统计
题目描述
有若干个同学的成绩单,形式如下:
姓名 语文成绩 数学成绩 英语成绩 颜值 ...
QAQ 59 59 59 100 ...
......
现在我想把这些同学的成绩按照一定顺序排列出来,请你帮帮我吧。
排列顺序如下:
(1)先比较语文成绩,语文成绩高的排前面;
(2)语文成绩相同的话,比较数学成绩,数学成绩高的排前面;
(3)数学成绩相同的话,比较英语成绩,英语成绩高的排前面;
(4)英语成绩相同的话,那就看脸啦,长的帅的排前面。
输入
第一行输入一个整数T,代表有T组测试数据。
每组数据第一行输入一个整数N,代表有N个学生的成绩。
接下来N行,每行依次输入一个字符串Name和四个整数Chinese、Math、English、Handsome,分别代表该同学的名字、语文成绩、数学成绩、英语成绩、帅气程度(值越大表示越帅气)。
注:1 <= T <= 20,1 <= N <= 1000,1 <= |Name| <= 10,0 <= Chinese, Math, English <= 100,1 <= Handsome <= N
其中字符串Name均有大写字母构成,保证Handsome的值均不相同。
输出
对每组数据,依次输出N个学生经过排序后的成绩。
样例输入
2
2
QAQ 59 59 59 2
WA 59 59 59 1
3
QAQ 59 59 59 2
WA 59 59 58 3
TLE 59 59 59 1
样例输出
QAQ 59 59 59 2
WA 59 59 59 1
QAQ 59 59 59 2
TLE 59 59 59 1
WA 59 59 58 3
解析:
按照题意比较就好,注意结构体的使用。
程序如下:
#include<cstdio> #include<algorithm> using namespace std; struct People { char c[100]; int ch; int ma; int en; int ha; }num[10003]; bool cmp(People a,People b) { if(a.ch!=b.ch) return a.ch>b.ch; else { if(a.ma!=b.ma) return a.ma>b.ma; else { if(a.en!=b.en) return a.en>b.en; else { if(a.ha!=b.ha) return a.ha>b.ha; } } } } int main() { int T; scanf("%d\n",&T); while(T--) { int n; scanf("%d\n",&n); for(int i=0; i<n; i++) scanf("%s%d%d%d%d",&num[i].c,&num[i].ch,&num[i].ma,&num[i].en,&num[i].ha); sort(num,num+n,cmp); for(int i=0; i<n; i++) printf("%s %d %d %d %d\n",num[i].c,num[i].ch,num[i].ma,num[i].en,num[i].ha); } return 0; }