StarHui


私信TA

用户名:uq_15565483691

访问量:2791

签 名:

只要你想,世界就会出现奇迹!

等  级
排  名 330
经  验 5281
参赛次数 2
文章发表 25
年  龄 18
在职情况 学生
学  校 西安汽车职业大学
专  业 人工智能

  自我简介:

大一新生一枚 一起学习交流,请加V:StarHui0415 个人公众号:阿辉的大本营 公众号会每天更新一道算法题!!!

TA的其他文章

解题思路:

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

微信图片_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分

1 人评分

  评论区