题目1014:排名(结构体排序)

问题来源

  http://ac.jobdu.com/problem.php?pid=1014

问题描述

  每次先输入考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;接着是第1题至第M题的正整数分值;之后是每名考生的准考证号(长度不超过20的字符串)、题目总数m、以及这m道题的题号(题目号由1到M)。

问题分析

  直接进行处理,计算出每个学生的总分数,超过分数线就加入到结构体数组中,最后对数组sort一下,输出即可。

  注意自定义的cmp比较函数写法:返回true就是前者排在前。

参考代码

//
// Created by AlvinZH on 2017/5/24.
// Copyright (c) AlvinZH. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

typedef struct Stu{
    char id[25];
    int Mark;
};

Stu S[1005];

bool cmp(const Stu &a,const Stu &b)
{
    if(a.Mark!=b.Mark)
        return a.Mark>b.Mark;
    else
        return strcmp(a.id,b.id)<0;
}

int main()
{
    int N,M,G;
    int Grade[11];
    int Count;
    while(~scanf("%d",&N)&&N!=0)
    {
        Count=0;
        scanf("%d %d",&M,&G);
        for(int i=1;i<=M;i++)
            scanf("%d",&Grade[i]);

        char Sid[25];
        int m;
        int Qid;
        int SumG;
        for(int i=1;i<=N;i++)
        {
            SumG=0;
            scanf("%s %d",&Sid,&m);
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&Qid);
                SumG+=Grade[Qid];
            }

            if(SumG>=G)
            {
                strcpy(S[Count].id,Sid);
                S[Count].Mark=SumG;
                Count++;
            }
        }
        sort(S,S+Count,cmp);
        printf("%d
",Count);
        for(int i=0;i<Count;i++)
            printf("%s %d
",S[i].id,S[i].Mark);
    }
}

作者: AlvinZH

出处: http://www.cnblogs.com/AlvinZH/

本人Github:https://github.com/Pacsiy/JobDu

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/AlvinZH/p/6899577.html