洛谷题解GESP结构体排序题解:B3968 [GESP202403 五级] 成绩排序
xyx404
 思路:
使用结构体快排,自己写判断函数,按照题目给出的进行判断,判断后历遍一次结构体数组,把学生的排名赋值,然后按照输入的顺序再排序一次最后输出就可以了。
如何赋值排名,如果和上一个人的排名是相同的就赋值为上一个人的排名,如果不是直接赋值为 i。
 代码:
| 
 #include<bits/stdc++.h>
 using namespace std;
 int n;
 struct node{
 long long sum,chinese,math,english;
 long long pm,bh;
 }stud[10002];
 bool cmp(node x,node y){
 if(x.sum!=y.sum)return x.sum>y.sum;
 else{
 if(x.chinese+x.math!=y.chinese+y.math)return x.chinese+x.math>y.chinese+y.math;
 else{
 if(max(x.chinese,x.math)!=max(y.chinese,y.math))return max(x.chinese,x.math)>max(y.chinese,y.math);
 else{
 
 return 0;
 }
 }
 }
 }
 bool cmp1(node x,node y){
 return x.bh<y.bh;
 }
 int main(){
 cin>>n;
 for(int i=1;i<=n;i++)cin>>stud[i].chinese>>stud[i].math>>stud[i].english,stud[i].sum=stud[i].chinese+stud[i].math+stud[i].english,stud[i].bh=i;
 sort(stud+1,stud+1+n,cmp);
 int cnt=1;
 for(int i=1;i<=n;i++){
 if(stud[i].sum==stud[i-1].sum
 &&stud[i].chinese+stud[i].math==stud[i-1].chinese+stud[i-1].math
 &&max(stud[i].chinese,stud[i].math)==max(stud[i-1].chinese,stud[i-1].math)){
 stud[i].pm=cnt;
 }
 else{
 cnt=i;
 stud[i].pm=cnt;
 }
 
 }
 sort(stud+1,stud+1+n,cmp1);
 for(int i=1;i<=n;i++)cout<<stud[i].pm<<"\n";
 return 0;
 }
 
 
 
 |