【成绩排序,按原顺依次序输出名次,有相同名次】
- 软件开发
- 2025-09-18 19:33:01

有 n 名同学,每名同学有语文、数学、英语三科成绩,你需要按照如下规则对所有同学的成绩从高到低排序:
比较总分,高者靠前;如果总分相同,则比较语文和数学两科的总分,高者靠前;如果仍相同,则比较语文和数学两科的最高分,高者靠前;如果仍相同,则二人并列。你需要输出每位同学的排名,如遇 xx 人并列,则他们排名相同,并留空后面的 x−1x−1 个名次。例如,有 33 名同学并列第 11,则后一名同学自动成为第 44 名。
Input第一行一个整数 NN,表示同学的人数。 接下来 NN 行,每行三个非负整数 ci,mi,eici,mi,ei 分别表示该名同学的语文、数学、英语成绩。
Output输出 NN 行,按输入同学的顺序,输出他们的排名。 注意:请不要按排名输出同学的序号,而是按同学的顺序输出他们各自的排名。
Sample 1 InputcopyOutputcopy 6 140 140 150 140 149 140 148 141 140 141 148 140 145 145 139 0 0 0 1 3 4 4 2 6思路:
1.先按照题目中条件依次写排序规则,名次一样是=时,return true;
2.排出名次后,按此顺序记录下各个同学的名次;
3.判断同名次时,再同时考虑三个因素,与前一个比较,如果三个条件都一样,名次与前一个同学一样;
4.因为要按原来的顺序输出名次,故要再拍一次序,按照原来的id号排;
5.最后再按照原来id循序依次输出名次
#include<bits/stdc++.h> using namespace std; struct stu{ int a,b,c; int t,sum,s2,mx,id; }st[10005]; bool cmp1(stu x,stu y)//按照题目中条件依次写排序规则 { if(x.sum!=y.sum) return x.sum>y.sum; else if(x.s2!=y.s2) return x.s2>y.s2; else if(x.mx!=y.mx) return x.mx>y.mx; else return true;//名次一样 } bool cmp2(stu x,stu y) { return x.id<y.id;//二次排序,使按照原来的顺序依次输出名次 } int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>st[i].a>>st[i].b>>st[i].c; st[i].id=i; st[i].sum=st[i].a+st[i].b+st[i].c; st[i].s2=st[i].a+st[i].b; st[i].mx=max(st[i].a,st[i].b); } sort(st,st+n,cmp1); st[0].t=1; //第一个名次肯定为1 for(int i=1;i<n;i++) { //这里必须要考虑三个条件,只有三个条件都一样时名次才一样 if((st[i].mx==st[i-1].mx)&&(st[i].sum==st[i-1].sum)&&(st[i].s2==st[i-1].s2)) { st[i].t=st[i-1].t; } else st[i].t=i+1;//地址从0开始,故名次要加1 } sort(st,st+n,cmp2); for(int i=0;i<n;i++) { cout<<st[i].t<<endl; } return 0; }【成绩排序,按原顺依次序输出名次,有相同名次】由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【成绩排序,按原顺依次序输出名次,有相同名次】”