杭电oj1236 排名

Tips:此题比较简单,最好将每一个学生的信息构建一个结构体,另外需要注意的是,若分数相同,排序按姓名排序,我看网上很多都是使用<algorithm>中的sort算法,只需重写cmp函数即可。

该方法如下所示:

1 #include<aigorithm>
2 bool cmp(const node &a,const node &b)  
3 {  
4     if(a.sum == b.sum)  
5         return strcmp(a.name,b.name) < 0 ? 1 : 0;  
6     else  
7         return a.sum > b.sum;  
8 }  

但由于我自己是采用纯C语言代码提交的,所以排序时时是自己写的sort函数,采用冒泡排序,虽然较慢,不过也可以AC

 1 void sort(struct node stu[],int n)
 2 {
 3     int i = 0;
 4     int j = 0;
 5     for(i = 0 ;i < n;i++)
 6     {
 7         for(j = i ; j < n ; j++)
 8         {
 9             if(stu[i].sum<stu[j].sum) //按分值由大到小排序
10             {
11                 struct node temp = stu[i];
12                 stu[i] = stu[j];
13                 stu[j] = temp;
14             }else if(stu[i].sum == stu[j].sum)
15             {
16                 if(strcmp(stu[i].name,stu[j].name) > 0)
17                 {
18                     struct node temp = stu[i];
19                     stu[i] = stu[j];
20                     stu[j] = temp;
21                 }
22             }
23         }
24     }
25 }

最后附上完整源程序:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSTU 1005
 4 struct node
 5 {
 6     char name[25]; //姓名
 7     int num; //完成题目数量
 8     int sum; //得分
 9 }stu[MAXSTU];
10 
11 void sort(struct node stu[],int n)
12 {
13     int i = 0;
14     int j = 0;
15     for(i = 0 ;i < n;i++)
16     {
17         for(j = i ; j < n ; j++)
18         {
19             if(stu[i].sum<stu[j].sum) //按分值由大到小排序
20             {
21                 struct node temp = stu[i];
22                 stu[i] = stu[j];
23                 stu[j] = temp;
24             }else if(stu[i].sum == stu[j].sum)
25             {
26                 if(strcmp(stu[i].name,stu[j].name) > 0)
27                 {
28                     struct node temp = stu[i];
29                     stu[i] = stu[j];
30                     stu[j] = temp;
31                 }
32             }
33         }
34     }
35 }
36 
37 int main()
38 {
39     int N = 0; //考生人数
40     int M = 0; //考题数量
41     int G = 0; //分数线
42     int score[10] = {0};//每道题的分值
43     int i=0,j=0;
44     int cnt = 0;
45     while(scanf("%d",&N) && N != 0)
46     {
47         scanf("%d %d",&M,&G);
48         for(i=0;i<M;i++)//读入第二行分值数据
49         {
50             scanf("%d",&score[i]);
51         }
52         cnt = 0;
53         for(i=0;i<N;i++)//循环读入每隔学生的信息数据
54         {
55             scanf("%s%d",stu[i].name,&stu[i].num);
56             stu[i].sum = 0;
57             while(stu[i].num--)
58             {
59                 scanf("%d",&j);
60                 stu[i].sum += score[j-1];
61             }
62             if(stu[i].sum >= G)
63                 cnt++;
64         }
65 
66         sort(stu,N);
67         printf("%d
",cnt);
68         for(i=0;i<N;i++)
69         {
70             if(stu[i].sum >= G)
71             {
72                 printf("%s %d
",stu[i].name,stu[i].sum);
73             }
74         }
75 
76     }
77     return 0;
78 }
原文地址:https://www.cnblogs.com/wujiyang/p/4793034.html