解题思路:
题前小叙:昨天才学会的结构体排序,本来以为只是一道简单的分数排序题,看统计 答案错误的好多,结果我一试,错了好几遍才通过,真是不容易啊!所以我特地把题解写出来,给大家提提醒。(还本地调试了好多次<__>)
思路:先使用结构体数组把数据存入,然后使用sort()函数排序,里面的cmp()函数逻辑是:如果成绩不相等,就排成绩;如果成绩相等,就排学号(这算第一个坑)。接下来第二个坑来了,那就是计划录取志愿者的人数*1.5向下取整,本来以为只是一个简简单单的向下取整,使用floor()函数向下取整就能得到结果(mm表示结果)了,可惜并不是,那个只是用来划分数线的,万一后面还有和分数线一样的人呢,So我们要使用for循环遍历一下结果(mm)后面的成绩,如果有与分数线相等的就mm++;坑到此结束了,接下来就是打印了。
具体步骤:
1、使用结构体数组储存数据
2、使用sort()函数排序,写好cmp()的逻辑
3、划分数线(结构体数组下标为floor(m * 1.5)对应的分数)
4、遍历mm后面的结构体数组的成绩(mm为取整后的结果),如果有与分数线相等的就mm++
5、打印
扩展:
取整函数:C++里面有好几个取整函数。这里就讲三个常用的吧,分别是ceil()、floor()、round(),记住都是cmath头文件里面的库函数
ceil(double a):向上取整,返回值是(int)a + 1(形象的表示一下)。不管a是0.1、0.9,使用ceil()函数返回值为1.
floor(double a):向下取整,返回值是(int) a。不管是0.1还是0.9,使用floor()函数返回值为0;
round(double a):四舍五入,如果a小于0.5,返回值就和向下取整的值一样;反之和向上取整的值一样;比如a = 0.1,round(a)的值为0,;a = 0.6,round(a) 的值为1。
注意事项:
1、cmp逻辑的书写。当成绩不同,比较成绩(降序);成绩相同比较学号(升序)
2、向下取整后的结果只是用来知道分数线的,并不代表进入面试的人数。还需要用for循环遍历一下,因为后面可能有和分数线相同的人
参考代码:
#include <iostream> #include <algorithm> #include <cmath> using namespace std; const int N = 5000; struct selection { int ID; int score; }x[N]; bool cmp(selection x,selection y)//成绩不同排成绩;成绩相等,排学号 { if(x.score != y.score) return x.score > y.score; else return x.ID < y.ID; } int main() { int n,m; cin >> n >> m; for(int i = 0;i < n;i++) cin >> x[i].ID >> x[i].score; sort(x,x + n,cmp); int mm = floor(m * 1.5),real_score = x[mm - 1].score;//实际面试人数,分数线 for(int i = mm;i < n;i++)//看看后面有没有与分数线相同的,有的话就mm++; { if(x[i].score == real_score) mm++; } cout << x[mm - 1].score << ' ' << mm << endl; for(int i = 0;i < mm;i++) cout << x[i].ID << ' ' << x[i].score << endl; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复