九度OJ 1061 成绩排序

来源:互联网 发布:asp网页源码 编辑:程序博客网 时间:2024/05/21 08:42

题目来源:http://ac.jobdu.com/problem.php?pid=1061
题目描述:

有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

输入:

测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。

输出:

将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后输出学生信息,按照如下格式:姓名 年龄 成绩

样例输入:

3
abc 20 99
bcd 19 97
bed 20 97

样例输出:

bcd 19 97
bed 20 97
abc 20 99

提示:

学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

该题目有两种解法,分别如下:
第一种解法:采用定义一个比较函数cmp的方法来实现,该代码如下:

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;struct E{    char name[101];    int age;    int score;}buf[1000]; bool cmp(E a,E b){                      //实现比较规则    if(a.score != b.score) return a.score < b.score;                                        //若分数不相同,则分数低者在前     int tmp = strcmp(a.name,b.name);    if(tmp != 0) return tmp < 0;        //若分数相同,则名字字典序小者在前    else return a.age < b.age;          //若名字也相同,则年龄小者在前 }int main(){    int n;    while(scanf("%d",&n) != EOF){        for(int i = 0;i < n;i ++){      //分别赋值;             scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);        }        sort(buf,buf + n,cmp);          //利用自己定义的规则对数组进行排序         for(int i = 0;i < n;i ++){            printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);                                        //按照题目要求的固定格式输出         }    }    return 0; }

第二种解法:直接定义结构体的小于运算符来说明排序规则(一般情况下采用此法),该代码如下:

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;struct E{    char name[101];    int age;    int score;    bool operator < (const E &b) const{ //利用C++运算符重载直接定义小于运算符        if(score != b.score) return score < b.score;        int tmp = strcmp(name,b.name);        if(tmp != 0) return tmp < 0;        else return age < b.age;     }}buf[1000]; int main(){    int n;    while(scanf("%d",&n) != EOF){        for(int i = 0;i < n;i ++){      //分别赋值;             scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);        }        sort(buf,buf + n);              //上面结构体定义中已经重载小于运算符,故sort函数第三个参数不需要比较函数         for(int i = 0;i < n;i ++){            printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);                                        //按照题目要求的固定格式输出         }     }    return 0; }
0 0
原创粉丝点击