排名(qsort函数的运用)

排名

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4701 Accepted Submission(s): 1469
 
Problem Description
今天的上机考试虽然有实时的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.
 
 
Source
浙大计算机研究生复试上机考试-2005年
 
Recommend
JGShining
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct S
{
    char cannu[22];
    int suslqu;
    int qid[10];
    int sumscore;
};
typedef struct S student;

<span style="color:#ff0000;">int com(const void *a, const void *b)
{
    student *c = (student *)a;
    student *d = (student *)b;
    if(c->sumscore!=d->sumscore)
        return d->sumscore - c->sumscore;
    else
        return strcmp( (*(student *)c).cannu , (*(student *)d).cannu );

}</span>
int main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    
    student s[1010];
    int qscore[10];
    int tnos, tnoq, gradeline;
    int i, j, k;
    int count;

    while(scanf("%d%d%d", &tnos, &tnoq, &gradeline)!=EOF)
    {
        if(!tnos)
            break;

        count=0;

        for(i=0;i<tnoq;i++)
            scanf("%d", &qscore[i]);

        for(j=0;j<tnos;j++)
        {
            s[j].sumscore=0;
            scanf("%s%d", &s[j].cannu, &s[j].suslqu);
            for(k=0;k<s[j].suslqu;k++)
            {
               scanf("%d", &s[j].qid[k]);
               s[j].sumscore+=qscore[s[j].qid[k]-1];//题号注意
            }
        }

        for(i=0;i<tnos;i++)
        {
            if(s[i].sumscore>=gradeline)
                count++;
        }

        printf("%d\n", count);

        qsort(s, tnos, sizeof(s[0]), com);

        for(i=0;i<count;i++)
        {
            printf("%s %d\n", s[i].cannu, s[i].sumscore);
        }

    }

    return 0;
}

题目没什么难度,就是有点繁琐,用这题熟悉一下qsort函数很不错。涉及到对结构体的二级排序。

你可能感兴趣的:(ACM,水题)