感觉这道题跟 P1093 有异曲同工之妙……推广一下这道题的题解)。

这道题考结构体排序,至于具体的看上面的题解。

要注意的是 cmp 函数中要判断如果成绩相等就根据序号来排。

这里不过多废话,直接贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<bits/stdc++.h>
using namespace std;
struct node{
string name;
int qm,bj,lw,jxj,xh;
char gb,xb;
}a[114];//变量名意义就是题目中各个量的首字母
bool cmp(node x,node y){
if(x.jxj==y.jxj)
return x.xh<y.xh;//特判
return x.jxj>y.jxj;
}
int n,c;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].name>>a[i].qm>>a[i].bj>>a[i].gb>>a[i].xb>>a[i].lw;
a[i].xh=i;//记录序号
if(a[i].qm>80&&a[i].lw>=1)
a[i].jxj+=8000;
if(a[i].qm>85&&a[i].bj>80)
a[i].jxj+=4000;
if(a[i].qm>90)
a[i].jxj+=2000;
if(a[i].qm>85&&a[i].xb=='Y')
a[i].jxj+=1000;
if(a[i].bj>80&&a[i].gb=='Y')
a[i].jxj+=850;//19到28行全都是判断这个人能得多少奖学金
c+=a[i].jxj;//累加
}
sort(a+1,a+n+1,cmp);//这次不需要用稳定排序了
cout<<a[1].name<<endl<<a[1].jxj<<endl<<c;
}