解题思路:

                题前小叙:昨天才学会的结构体排序,本来以为只是一道简单的分数排序题,看统计 答案错误的好多,结果我一试,错了好几遍才通过,真是不容易啊!所以我特地把题解写出来,给大家提提醒。(还本地调试了好多次<__>)

微信图片_20221121120602.png

                思路:先使用结构体数组把数据存入,然后使用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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论