世界杯logo

题解:B3968 [GESP202403 五级] 成绩排序

题解: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; //完结撒花

}