zoukankan      html  css  js  c++  java
  • CCF NOI1042 发奖学金

    问题链接CCF NOI1042 发奖学金




    时间限制: 1000 ms  空间限制: 262144 KB

    题目描述 

      某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
      任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
    7 279
    5 279
      这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
    5 279
    7 279
      则按输出错误处理,不能得分。

    输入

      包含n+1行: 第1行为一个正整数n,表示该校参加评选的学生人数。
      第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n (恰好是输入数据的行号减1)。所给的数据都是正确的,不必检验。

    输出

      共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。

    样例输入

    6
    90 67 80
    87 66 91
    78 89 91
    88 99 77
    67 89 64
    78 89 98
    样例输出

    6 265
    4 264
    3 258
    2 244
    1 237

    数据范围限制

      50%的数据满足:各学生的总成绩各不相同;
      100%的数据满足: 6<=n<=300。

    提示

     




    问题分析

      这是一个排序问题,排序后输出结果即可

    程序说明

      这里给出C语言程序和C++语言程序。它们的排序函数不一样,需要注意。

      想比较而言,C++语言的排序函数sort()使用起来比较简洁。

    要点详解

    • 使用宏定义可以使得代码可阅读性增强。
    • C语言的排序函数是qsort(),需要留意用法。
    • C++语言的排序函数是sort(),需要留意用法。



    参考链接:(略)。

    100分通过的C语言程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 300
    #define N2 5
    
    struct _student {
        int no;
        int yuwen;
        int total;
    } s[N];
    
    int cmp( const void *a , const void *b )
    {
        struct _student *pa = (struct _student *)a;
        struct _student *pb = (struct _student *)b;
    
        if(pa->total != pb->total)
            return pa->total < pb->total;
        else if(pa->yuwen != pb->yuwen)
            return pa->yuwen < pb->yuwen;
        else
            return pa->no > pb->no;
    }
    
    int main(void)
    {
        int n, a, b, i;
    
        scanf("%d", &n);
        for(i=0; i<n; i++) {
            scanf("%d%d%d", &s[i].yuwen, &a, &b);
            s[i].no = i + 1;
            s[i].total = s[i].yuwen + a + b;
        }
    
        qsort(s, n, sizeof(s[0]), cmp);
    
        for(i=0; i<N2; i++)
            printf("%d %d
    ", s[i].no, s[i].total);
    
        return 0;
    }

    100分通过的C++语言程序:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 300;
    const int N2 = 5;
    
    struct _student {
        int no;
        int yuwen;
        int total;
    } s[N];
    
    int cmp(const _student &a, const _student &b)
    {
        if(a.total != b.total)
            return a.total > b.total;
        if(a.yuwen != b.yuwen)
            return a.yuwen > b.yuwen;
        else
            return a.no < b.no;
    }
    
    int main()
    {
        int n, a, b;
    
        cin >> n;
        for(int i=0; i<n; i++) {
            cin >> s[i].yuwen >> a >> b;
            s[i].no = i + 1;
            s[i].total = s[i].yuwen + a + b;
        }
    
        sort(s, s + n, cmp);
    
        for(int i=0; i<N2; i++)
            cout << s[i].no << " " << s[i].total << endl;
    
        return 0;
    }



  • 相关阅读:
    redis发布订阅
    redis学习笔记(面试题)
    redis安全 (error) NOAUTH Authentication required
    HDU3001 Travelling —— 状压DP(三进制)
    POJ3616 Milking Time —— DP
    POJ3186 Treats for the Cows —— DP
    HDU1074 Doing Homework —— 状压DP
    POJ1661 Help Jimmy —— DP
    HDU1260 Tickets —— DP
    HDU1176 免费馅饼 —— DP
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563867.html
Copyright © 2011-2022 走看看