P1093 [NOIP2007 普及组] 奖学金

这篇具有很好参考价值的文章主要介绍了P1093 [NOIP2007 普及组] 奖学金。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 3 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 5 5 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 7 7 279 279 279
5 5 5 279 279 279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 7 7 号、 5 5 5 号。这两名同学的总分都是 279 279 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 7 7 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:

5 5 5 279 279 279
7 7 7 279 279 279

则按输出错误处理,不能得分。

输入格式

n + 1 n+1 n+1行。

1 1 1 行为一个正整数 n ( ≤ 300 ) n ( \le 300) n(300),表示该校参加评选的学生人数。

2 2 2 n + 1 n+1 n+1 行,每行有 3 3 3 个用空格隔开的数字,每个数字都在 0 0 0 100 100 100 之间。第 j j j 行的 3 3 3 个数字依次表示学号为 j − 1 j-1 j1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1 ∼ n 1\sim n 1n(恰好是输入数据的行号减 1 1 1)。

所给的数据都是正确的,不必检验。

//感谢 黄小U饮品 修正输入格式

输出格式

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

样例 #1

样例输入 #1

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #1

6 265
4 264
3 258
2 244
1 237

样例 #2

样例输入 #2

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #2

8 265
2 264
6 264
1 258
5 258

1.题目分析

输入学生个数,再分别输入每个学生的语数外的成绩。
按照以下要求进行排序:

  • 先按总分排序。
  • 若总分相同,则按语文成绩排序。
  • 若语文成绩再相同,则按学号从小到大排序。
    排序后,依次输出前五名的学号和总分。

这题一眼使用结构体数组,封装每个学生的信息再进行排序。

2.题目思路

先定义一个结构体数组,封装学生的学号,语数外成绩以及总分。

编写一个交换函数:用于排序时交换结构体数组上指定索引上元素的位置。

主函数:文章来源地址https://www.toymoban.com/news/detail-691314.html

  1. 键入数据:学生个数,语数外成绩,总分一边计算一边存入结构体数组。
  2. 使用选择排序 ,先按总分排,若相同,依次按语文成绩排序,按学号排。值得一提的是,除了学号是升序外,其他全是降序。
  3. 最后输出前五名(数组前5个元素)即可。

3.代码实现

#include <iostream>

using namespace std;
//定义结构体,封装学生信息
typedef struct data {
    //学号
    int Id;
    //语数外成绩
    int ch, ma, en;
    //总分
    int sum;
} Stu;
//交换结构体数组上指定索引上元素的位置
void swap(Stu *stu, int i, int j) {
    Stu temp = stu[i];
    stu[i] = stu[j];
    stu[j] = temp;
}

int main() {
    int n;
    cin >> n;
    Stu stu[n];
    //键入数据
    for (int i = 0; i < n; ++i) {
        cin >> stu[i].ch >> stu[i].ma >> stu[i].en;
        stu[i].Id = i + 1;
        //求和
        stu[i].sum = stu[i].ch + stu[i].ma + stu[i].en;
    }
    //排序,总分,语文成绩,学号
    //选择排序
    for (int i = 0; i < n - 1; ++i) {
        for (int j = i + 1; j < n; ++j) {
            //先按总分排
            if (stu[i].sum < stu[j].sum) {
                swap(stu, i, j);
            } else if (stu[i].sum == stu[j].sum) {
                //按语文成绩排序
                if (stu[i].ch < stu[j].ch) {
                    swap(stu, i, j);
                } else if (stu[i].ch == stu[j].ch) {
                    //按学号排
                    if (stu[i].Id > stu[j].Id) {
                        swap(stu, i, j);
                    }
                }
            }
        }
    }
    //输出前五名
    for (int i = 0; i < 5; ++i) {
        cout << stu[i].Id << " " << stu[i].sum << endl;
    }


    return 0;
}

到了这里,关于P1093 [NOIP2007 普及组] 奖学金的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • #P0998. [NOIP2007普及组] 守望者的逃离

    恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。 守望者的跑步

    2024年02月14日
    浏览(19)
  • 从[SDOI2011]消防 到[NOIP2007]树网的核

    有关消防一题中最优解一定在直径上的证明 P2491 [SDOI2011] 消防 P1099 [NOIP2007 提高组] 树网的核 在一颗 (n) 个节点的无根树中,找到一条不超过 (s) 的路径,使得图中所有点到此路径距离的最大值最小,图中边权非负 若想将此题转化到树网的核,需要证明 对于任意一条不在直

    2024年02月05日
    浏览(24)
  • #P1007. [NOIP2007提高组] 矩阵取数游戏

    帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}ai,j​ 均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共 nn 个。经过 mm 次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行

    2024年02月15日
    浏览(33)
  • 【洛谷 P1097】[NOIP2007 提高组] 统计数字 题解(映射)

    注意 :数据可能存在加强。 某次科研调查时得到了 n n n 个自然数,每个数均不超过 1.5 × 1 0 9 1.5 times 10^9 1.5 × 1 0 9 。已知不相同的数不超过 1 0 4 10^4 1 0 4 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 共 n + 1 n+1 n + 1 行。 第一

    2024年02月09日
    浏览(36)
  • [NOIP2002 普及组] 选数#洛谷

    已知 n n n 个整数 x 1 , x 2 , ⋯   , x n x_1,x_2,cdots,x_n x 1 ​ , x 2 ​ , ⋯ , x n ​ ,以及 1 1 1 个整数 k k k ( k n kn k n )。从 n n n 个整数中任选 k k k 个整数相加,可分别得到一系列的和。例如当 n = 4 n=4 n = 4 , k = 3 k=3 k = 3 , 4 4 4 个整数分别为 3 , 7 , 12 , 19 3,7,12,19 3 , 7 , 12 , 19 时,

    2024年01月20日
    浏览(35)
  • 一本通1919:【02NOIP普及组】选数

    这道题感觉很好玩。 先放题目: 信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn) http://ybt.ssoier.cn:8088/problem_show.php?pid=1919 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,

    2024年02月16日
    浏览(23)
  • #P1003. [NOIP2009普及组] 道路游戏

    小新正在玩一个简单的电脑游戏。 游戏中有一条环形马路,马路上有 nn 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接。小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn 个机器人工厂编号为 1sim n1∼n,因为马路是环形的,所以第 nn 个机器人工厂和

    2024年02月15日
    浏览(25)
  • NOIP2003普及组复赛T2:数字游戏

    题目链接:NOIP2003普及组复赛T2 - 数字游戏 丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共 n n n 个),你要按顺序将其分为 m m m 个部分

    2024年02月09日
    浏览(28)
  • #P0999. [NOIP2008普及组] 排座椅

    上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐成了 MM 行 NN 列,坐在第 ii 行第 jj 列

    2024年02月15日
    浏览(34)
  • NOIP2013普及组复赛T4:车站分级

    题目链接:洛谷P1983 [NOIP2013 普及组] 车站分级 一条单向的铁路线上,依次有编号为 1 , 2 , … , n 1, 2, …, n 1 , 2 , …

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包