```
#include<bits/stdc++.h>
using namespace std;
struct stu//定义学生结构体
{
int c,m,e;
int id;
int zf;
int p;
}s[10001];
int n;//学生个数
bool cmp(stu a,stu b)//排序函数1
{
if(a.zf>b.zf) return 1;//总分
if(b.zf>a.zf) return 0;
if(a.c+a.m>b.c+b.m) return 1;//语文数学总分
if(a.c+a.m<b.c+b.m) return 0;
if(max(a.c,a.m)>max(b.c,b.m)) return 1;//语文数学最高分
if(max(a.c,a.m)<max(b.c,b.m)) return 0;
return 0;
}
bool cmp_2(stu a,stu b)//排序函数2
{
return a.id>b.id;//排序学号
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//输入
{
cin>>s[i].c>>s[i].m>>s[i].e;
s[i].id=i;//记录学号
s[i].zf=s[i].c+s[i].m+s[i].e;//记录总分
}
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(s[i-1].zf==s[i].zf&&(s[i-1].c+s[i-1].m)==(s[i].c+s[i].m)&&max(s[i-1].c,s[i-1].m)==max(s[i].c,s[i].m))
s[i].p=s[i-1].p;//如果总分相同与语文数学总分相同与语文数学最高分相同
else
s[i].p=i;//否则按规则排序
}
sort(s+1,s+n+1,cmp_2);//再sort一遍学号
for(int i=n;i>=1;i--)
{
cout<<s[i].p<<endl;//输出排名
}
return 0;
}
```
by Luowj @ 2024-05-31 20:26:24
@[Luowj](/user/1181602)
谢谢大佬,大概明白了
by douhuazhenren1 @ 2024-05-31 20:32:19