
洛谷1093 奖学金(排序)
发布日期:2021-05-07 06:19:48
浏览次数:23
分类:原创文章
本文共 1108 字,大约阅读时间需要 3 分钟。
题目描述:
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
77 279279
55 279279
这两行数据的含义是:总分最高的两个同学的学号依次是77号、55号。这两名同学的总分都是 279279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为77的学生语文成绩更高一些。如果你的前两名的输出数据是:
55 279279
77 279279
则按输出错误处理,不能得分。
思路:
这道题目没什么转弯的地方,不过这道题目应用C++的sort函数很大的简化了代码,主要在于cmp函数的编写,自定义从大到小和从小到大排序。直接上代码。
代码:
#include <iostream>#include <algorithm> #include <cstdio> using namespace std;typedef struct{ int num; int s1; int s2; int s3; int score;}STU;STU stu[305];int cmp(STU a, STU b){ if (a.score!=b.score) return a.score>b.score; if (a.s1!=b.s1) return a.s1>b.s1; return a.num<b.num;}int main(){ int n, i; scanf("%d", &n); for (i=1; i<=n; i++){ scanf("%d%d%d", &stu[i].s1, &stu[i].s2, &stu[i].s3); stu[i].score=stu[i].s1+stu[i].s2+stu[i].s3; stu[i].num=i; } sort(stu+1, stu+n+1, cmp); for (i=1; i<=5; i++) printf("%d %d\n", stu[i].num, stu[i].score); return 0;}
发表评论
最新留言
很好
[***.229.124.182]2025年04月05日 18时19分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java中Map的用法详解
2019-03-04
base64编码字符串和图片的互转
2019-03-04
汉字转为拼音
2019-03-04
linux 下安装kolla报错 提示Cannot uninstall requests
2019-03-04
C++ throw、try、catch、noexcept
2019-03-04
设计模式之组合模式
2019-03-04
Linux 验证、数字证书、RPM包中文件的提取
2019-03-04
(恋上数据结构笔记):优先级队列(Priority Queue)
2019-03-04
(Python学习笔记):字典
2019-03-04
(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念
2019-03-04
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
2019-03-04
(C++11/14/17学习笔记):创建多个线程、数据共享问题分析及案例
2019-03-04
(音视频学习笔记):SDL-YUV显示-播放音频PCM
2019-03-04
leetcode 14 最长公共前缀
2019-03-04
做做Java
2019-03-04
2020-2021新技术讲座课程
2019-03-04
shell中的数学运算
2019-03-04
如何使用4G模块通过MQTT协议传输温湿度数据到onenet
2019-03-04