题解:B3968 [GESP202403 五级] 成绩排序 queenbee · 2024-04-22 18:38:44 · 题解 B3968 成绩排序 题解 思路 题目传送门,用结构体存储每个同学语、数、英三科的成绩,再写一个 cmp 函数按照先比较总分,再比较语、数总分,再比较语、数最高分的顺序对成绩进行排序,将他们的排名按照编号储存到数组中,最后输出各自的排名即可。 其中储存排名的部分,因为可能有并列的同学,所以要先判断总分,语、数总分,语、数最高分与上一名同学是否相同,如果相同,则两人并列,排名为变量 t。若不同,则排名为当前遍历的人数 i,并将 t 更新为 i。 for(int i=1;i<=n;i++){ //按编号储存排名 if(f[i].sum==f[i-1].sum&&f[i].a+f[i].b==f[i-1].a+f[i-1].b&&max(f[i].a,f[i].b)==max(f[i-1].a,f[i-1].b)){ //判断是否并列 v[f[i].num]=t; } else{ v[f[i].num]=i; t=i; } } 程序 #include using namespace std; const int N=1e4+10; struct Node{ int sum,num; int a,b,c; }f[N]; int n; int t=1; int v[N]; bool cmp(Node a,Node b){ //按规则排序 if(a.sum==b.sum){ //判断成绩是否相同 if(a.a+a.b==b.a+b.b){ //判断语、数总分是否相同 return max(a.a,a.b)>max(b.a,b.b); //判断语、数最大值是否相同 } return a.a+a.b>b.a+b.b; } return a.sum>b.sum; } int main(){ cin>>n; for(int i=1;i<=n;i++){ f[i].num=i; //编号 cin>>f[i].a>>f[i].b>>f[i].c; f[i].sum=f[i].a+f[i].b+f[i].c; //总分 } sort(f+1,f+n+1,cmp); //排序 for(int i=1;i<=n;i++){ //按编号储存排名 if(f[i].sum==f[i-1].sum&&f[i].a+f[i].b==f[i-1].a+f[i-1].b&&max(f[i].a,f[i].b)==max(f[i-1].a,f[i-1].b)){ //判断是否并列 v[f[i].num]=t; } else{ v[f[i].num]=i; t=i; } } for(int i=1;i<=n;i++){ //按编号输出排名 cout< } return 0; //完结撒花 }