解题思路:
题前小叙:昨天才学会的结构体排序,本来以为只是一道简单的分数排序题,看统计 答案错误的好多,结果我一试,错了好几遍才通过,真是不容易啊!所以我特地把题解写出来,给大家提提醒。(还本地调试了好多次<__>)
思路:先使用结构体数组把数据存入,然后使用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语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:806 |
程序员的表白 (C语言代码)浏览:1463 |
【出圈】 (C语言代码)浏览:590 |
最长单词 (C语言代码)浏览:1474 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:1432 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:1072 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:822 |
母牛的故事 (C语言代码)浏览:1045 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:331 |
陈教主的三角形 (C语言代码)浏览:1196 |