排名(sort) HDU - 1236 初用重载cmp(与结构体有关)

排名(sort) HDU - 1236 初用重载cmp(与结构体有关)

今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
Input
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
Output
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。
Sample Input
4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
0
Sample Output
3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20

Hint
Huge input, scanf is recommended.

个人分析:

对于这个题,我们输出第一个值是学生学号(和考号差不多,这里我就说学号轮),空格一下,第二个值是学生的分数 只输出超过了合格分的成绩 因此,我们定义了一下结构体:

struct node{
    char sno[24];
    int  grade;
}stu[1008];

这个题关键点就是重载CMP函数了 这里我需要解释一下了:
sort函数默认是将数组或者结构体的值从小到大来排列 那么如果题目不是按照这样排就需要重载一下了 请阅读下面代码 题目要求:随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考 号的升序输出。
简单说是分数高的先输出 分数如果一样 按照学号升序排(也就是学好小的在前面)

解释: 显然,如果分数不同,那么直接按照降序排列,对应于if语句 如果分数不同就比较两个字符串了,strcmp方法就是x.sno-y.sno 后面三元运算符意思是 只有当前面那个小于或等于(等于应该不存在) 所以,前面直接小于后面那个的时候 就为1 对应于升序排序

重载CMP

int cmp(node x,node y)
{
    if(x.grade!=y.grade)
    {
        return x.grade>y.grade;
    }
    else
    {
        return strcmp(x.sno,y.sno)>0? 0:1;
    }
}

个人感受:

这个题非常不错哦~也是让我第一次体会到了重载cmp大法哦,不知道你们有没有和我相同的感受,一听到什么按照分数降序排然后如果分数相同就按学号的升序排 你们有没有立马联想到SqlServer 关于数据库方面的知识呢 反正博主我联想到了 O(∩_∩)O哈哈~ 其实这个题很关键的点就是这个重载结构体 然后sort排序方法的使用 其他的只要理清思路应该是能看懂的 关于sort排序我也写了几篇博客了 可以去看一看 在我的专栏里面!
另外,我代码里面一些容易错的地方我也得提出来:1,变量命名规范问题,不然后面变量多了容易混杂 2,stu[i].grade=0; 这句代码不能忘,在我们求和的时候 尤其是对于多组输入与输出的时候 将求和的变量要先默认为0好一点

具体代码如下:
AC

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
    char sno[24];
    int  grade;
}stu[1008];
int cmp(node x,node y)
{
    if(x.grade!=y.grade)
    {
        return x.grade>y.grade;
    }
    else
    {
        return strcmp(x.sno,y.sno)>0? 0:1;
    }
}
int main()
{
    int n;
    int m,g;
    while(~scanf("%d%d%d",&n,&m,&g)&&n)
    {
        int num[20];
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            cin>>num[i];
        }
        for(int i=0;i<n;i++)
        {
            cin>>stu[i].sno;
            int t;
            cin>>t;
            stu[i].grade=0;
            for(int j=1;j<=t;j++)
            {
                int x;
                cin>>x;
                stu[i].grade+=num[x];
            }
            if(stu[i].grade>=g)
            {
                ans++;
            }
        }
        cout<<ans<<endl;
        sort(stu,stu+n,cmp);
        for(int i=0;i<ans;i++)
        {
            cout<<stu[i].sno<<" "<<stu[i].grade<<endl;
        }
    }
    return 0;
}

学如逆水行舟,不进则退 

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/87452488