JustOj 2039: 成绩排名 (结构体排序)

题目描述

每次期末考试成绩出来之前的一段时间大豪哥心里都是痛苦的,总感觉自己会在班上排名特别差。所以当成绩出来以后大豪哥想快点知道班上的总排名,以便知道自己的排名。(PS:大豪哥班上有个学霸名叫日天,又名泰迪,不要问我为什么,因为泰迪的行为决定的)

输入

多组测试数据,至文件结尾。
先输入每个班上有n个同学,这个学期有m门课程(1<=n,m<=100)
接下来有n行,每行的输入格式为学号id,姓名name,课程成绩k1,课程成绩k2... ,课程成绩km.(学号在int型范围以内,0<=ki<=100,姓名长度在20个字符以下)

输出

输出班上每个同学排名,并输出总分及排名(如果总分相同就按学号从小到大输出,但是排名还是相同的)输出格式见样例

样例输入
4 4
1 Taidi 100 100 90 90
2 Dahaoge 60 60 70 60
3 Yeshen 90 90 100 100
4 Wangpangzi 50 60 100 80
样例输出
1 Taidi 100 100 90 90 Sum = 380 Ranking = 1
3 Yeshen 90 90 100 100 Sum = 380 Ranking = 1
4 Wangpangzi 50 60 100 80 Sum = 290 Ranking = 3
2 Dahaoge 60 60 70 60 Sum = 250 Ranking = 4

题解:结构体排序
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 const int N=110;
29 const int mod=1e9+7;
30 struct node
31 {
32     int id;
33     string name;
34     int grade[N];
35     int sum;
36 }stu[N];
37 bool cmp(node a,node b)
38 {
39     if(a.sum==b.sum)
40         return a.id<b.id;
41     return a.sum>b.sum;
42 }
43 int main()
44 {
45     int n,m,num;
46     cin.sync_with_stdio(false);
47     while(cin>>n>>m){
48         for(int i=0;i<n;i++){
49             cin>>stu[i].id>>stu[i].name;
50             stu[i].sum=0;
51             for(int j=0;j<m;j++){
52                 cin>>stu[i].grade[j];
53                 stu[i].sum+=stu[i].grade[j];
54             }
55         }
56         sort(stu,stu+n,cmp);
57         for(int i=0;i<n;i++){
58             cout<<stu[i].id<<" "<<stu[i].name;
59             for(int j=0;j<m;j++){
60                 cout<<" "<<stu[i].grade[j];
61             }
62             if(i==0) num=1;
63             else if(stu[i].sum!=stu[i-1].sum)
64                 num=i+1;
65             cout<<" Sum = "<<stu[i].sum<<" Ranking = "<<num<<endl;
66         }
67     }
68     return 0;
69 }
原文地址:https://www.cnblogs.com/wydxry/p/7274048.html