专栏文章
B3968 [GESP202403 五级] 成绩排序 题解
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip16sur
- 此快照首次捕获于
- 2025/12/03 04:29 3 个月前
- 此快照最后确认于
- 2025/12/03 04:29 3 个月前
B3968 [GESP202403 五级] 成绩排序 题解
这是一道复杂、废手的模拟题。
代码:
CPP#include<bits/stdc++.h>
using namespace std;
struct P//结构体
{
int d,c,m,e,r,w;//分别为:学号、语文成绩、数学、英语、排名、总分
void cn(int i)//输入
{
cin>>c>>m>>e;
w=c+m+e;
d=i;
}
}s[11111];
bool c1(P x,P y)//按成绩排序
{
if(x.w!=y.w) return x.w>y.w;//比较总分,高者靠前
if(x.c+x.m!=y.c+y.m) return x.c+x.m>y.c+y.m;//如果总分相同,则比较语文和数学两科的总分,高者靠前
if(max(x.c,x.m)!=max(y.c,y.m)) return max(x.c,x.m)>max(y.c,y.m);如果仍相同,则比较语文和数学两科的最高分,高者靠前
return 1;//如果仍相同,则二人并列
}
bool c2(P x,P y){return x.d<y.d;}//按学号排序
bool t(P x,P y){return (x.w==y.w&&x.c+x.m==y.c+y.m&&max(x.c,x.m)==max(y.c,y.m));}//检测是否并列
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) s[i].cn(i);
sort(s+1,s+n+1,c1);//先按成绩排序,赋排名
for(int i=1;i<=n;i++) s[i].r=(t(s[i-1],s[i])?s[i-1].r:i);//如果2人并列,则此人与上一人排名相同,否则排名为i
sort(s+1,s+n+1,c2);//根据题目要求,输出时按学号排序
for(int i=1;i<=n;i++) cout<<s[i].r<<endl;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...