专栏文章

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 条评论,欢迎与作者交流。

正在加载评论...