Sort练习题

news2024/10/6 14:28:24

sort 练习

练习题

  1. 题目:浮点数排序

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>    //sort()排序
#include <cmath>    //round()来找最近的整数
using namespace std;
const double EPSILON = 1e-6;    //两个浮点数的差小于该数则认为两数相等,1 * (10 ^ (-6))
double num[105];
//计算距离它最近的整数的差
double sub(double x)
{
    return fabs(x - round(x));  //不知道谁更大,用fabs取绝对值
}
bool cmp(double a, double b)
{
    if (fabs(sub(a) - sub(b)) < EPSILON)
    {   //差值相等,则用本身的值排序
        return a < b;
    }
    return sub(a) < sub(b);
}

int main()
{
    int N;
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        scanf("%lf", &num[i]);
    }
    sort(num, num + N, cmp);
    for (int i = 0; i < N; i++)
    {
        if (i != (N - 1)) {
            //cout << num[i] << " ";
            printf("%lf ", num[i]); //%lf默认是保留六位,不需要加.6
        }
        else {
            //cout << num[i] << endl;
            printf("%lf\n", num[i]);
        }
    }
    return 0;
}
/*
输入:
9
1.001 2.1 3.2 4.0001 5.00001 6.9 7.2 8.001 9.0
输出:
9.000000 5.000010 4.000100 1.001000 8.001000 2.100000 6.900000 3.200000 7.200000
*/
  1. 取中位数之后,达到中位数的人可能很多,所以并不是简单的取前一半

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
int score[100005];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &score[i]);
    }
    sort(score, score + n, greater<int>());
    printf("%d ", score[(n - 1) / 2]);
    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        if (score[i] >= score[(n - 1) / 2])
            cnt++;
        else
            break;
    }
    printf("%d\n", cnt);
    return 0;
}
/*
输入:
7
76 71 42 4 27 27 20
输出:
27 5
*/
  1. 交叉排序
    在这里插入图片描述

    #define _CRT_SECURE_NO_WARNINGS
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int num[10005];
    
    int main()
    {
        int N, l1, l2, r1, r2;
        scanf("%d%d%d%d%d", &N, &l1, &r1, &l2, &r2);
        for (int i = 0; i < N; i++)
        {
            scanf("%d", &num[i]);
        }
        //第l1个下标是l1-1,第r1下标是r1-1
        sort(num + l1 - 1, num + r1);
        sort(num + l2 - 1, num + r2, greater<int>());
        for (int i = 0; i < N; i++)
        {
            if (i != N - 1)
                printf("%d ", num[i]);
            else
                printf("%d\n", num[i]);
        }
        return 0;
    }
    /*
    输入:
    6 1 3 2 4
    8 3 1 6 9 2
    输出:
    1 8 6 3 9 2
    */
    
  2. 排序之后统计,注意求char数组这种C风格字符串的长度要用strlen(),min虽然只能求两个数中间较小的,但嵌套就能求三个数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>    //sort, min
#include <cstring>  //strlen

using namespace std;
char s[10005];

int main()
{
    int len, r = 0 ,g = 0, b = 0;
    scanf("%s", s);
    len = strlen(s);
    sort(s, s + len);
    printf("%s\n", s);
    for (int i = 0; i < len; i++)
    {
        if (s[i] == 'R')
            r++;
        else if (s[i] == 'G')
            g++;
        else
            b++;
    }
    printf("%d\n", min(min(r, g / 2), b / 3));
    return 0;
}
/*
输入:
RGGBBB
输出:
BBBGGR
1
*/
  1. 计算数据各位之和

    #define _CRT_SECURE_NO_WARNINGS
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int num[105];
    int sumX(int a)
    {
        int ans = 0;
        while (a)
        {
            ans += a % 10;
            a /= 10;
        }
        return ans;
    }
    bool cmp(int a, int b)
    {
        if (sumX(a) == sumX(b))
        {
            return a < b;
        }
        return sumX(a) < sumX(b);
    }
    
    int main()
    {
        int N;
        scanf("%d", &N);
        for (int i = 0; i < N; i++)
            scanf("%d", &num[i]);
        sort(num, num + N, cmp);
        for (int i = 0; i < N; i++)
        {
            if (i != N - 1)
                printf("%d ", num[i]);
            else
                printf("%d\n", num[i]);
        }
        return 0;
    }
    /*
    输入:
    4
    20 12 1 11
    输出:
    1 11 20 12
    */
    
  2. 使用结构体

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
/*
输入学生人数和每个学生的分数
输出成绩排名的学生编号
*/
struct Student
{
    int score;
    int id;
};
bool cmp(Student a, Student b)
{
    return a.score > b.score;
}
Student stu[105];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &stu[i].score);
        stu[i].id = i + 1;
    }
    sort(stu, stu + n, cmp);
    for (int i = 0; i < n; i++)
    {
        if (i != n - 1)
            printf("%d ", stu[i].id);
        else
            printf("%d\n", stu[i].id);
    }
    return 0;
}
/*
输入:
5
97
68
51
85
73
输出:
1 4 5 2 3
*/
  1. 稍微麻烦一些,对于字符串,string定义的话,是不可以用scanf和printf的。

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
struct Student
{
    //没说学生姓名的长度,所以最好不要用char数组,用string
    string name;
    //char name[105];
    int score[4];
};
Student stu[105];
bool cmp1(Student a, Student b)
{
    if (a.score[0] != b.score[0])
        return a.score[0] > b.score[0];
    return a.name < b.name;
    //return strcmp(a.name, b.name) < 0; //小于0,a小;大于0,b小
}
bool cmp2(Student a, Student b)
{
    if (a.score[1] != b.score[1])
        return a.score[1] > b.score[1];
    return a.name < b.name;
}
bool cmp3(Student a, Student b)
{
    if (a.score[2] != b.score[2])
        return a.score[2] > b.score[2];
    return a.name < b.name;
}
bool cmp4(Student a, Student b)
{
    if (a.score[3] != b.score[3])
        return a.score[3] > b.score[3];
    return a.name < b.name;
}
bool cmp(Student a, Student b)
{
    int suma = 0, sumb = 0;
    for (int i = 0; i < 4; i++)
    {
        suma += a.score[i];
        sumb += b.score[i];
    }
    if (suma != sumb)
        return suma > sumb;
    return a.name < b.name;
}

void print()
{
    for (int i = 0; i < 3; i++)
    {
        cout << stu[i].name << " ";
    }
    cout << stu[3].name << endl;
}

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        cin >> stu[i].name;
        //scanf("%s", stu[i].name);   //输入字符数组不需要&
        for (int j = 0; j < 4; j++)
            scanf("%d", &stu[i].score[j]);
    }
    sort(stu, stu + n, cmp1);
    print();
    sort(stu, stu + n, cmp2);
    print();
    sort(stu, stu + n, cmp3);
    print();
    sort(stu, stu + n, cmp4);
    print();
    sort(stu, stu + n, cmp);
    print();
    return 0;
}
/*
输入:
5
Alice 99 98 97 96
Bob 98 97 96 94
Coy 94 94 95 96
Dan 93 95 96 97
Evan 0 94 95 95
输出:
Alice Bob Coy Dan
Alice Bob Dan Coy
Alice Bob Dan Coy
Dan Alice Coy Evan
Alice Bob Dan Coy
*/
  1. 抢气球

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Kid
{
    int a;  //高度
    int id;
};

int ans[1005];
Kid k[1005];
int h[1005];    //  气球高度
int used[1005]; //  是否被摘过

bool cmp(Kid x, Kid y)
{
    return x.a < y.a;
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &k[i].a);
        k[i].id = i;
    }
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &h[i]);
    }
    sort(k, k + n, cmp);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (!used[j] && h[j] <= k[i].a)
            {
                ans[k[i].id]++;
                used[j] = true;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        printf("%d\n", ans[i]);
    }
    return 0;
}
/*
输入:
10 10
1 2 3 4 5 6 7 8 9 10
3 1 4 6 7 8 9 9 4 12
输出:
1
0
1
2
0
1
1
1
2
0
*/
//时间复杂度:O(nm)
  1. 将上面的题改为 1 ≤ n , m ≤ 1 0 5 1 \leq n,m \leq 10^5 1n,m105

    机器一秒钟可能运行 1 0 8 10^8 108,所以上面那种不可行

    其实每一个孩子并不需要考虑全部的气球,只需要把气球也排序,这样前面的孩子能摘得,后面的孩子就不能摘了。

    #define _CRT_SECURE_NO_WARNINGS
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    struct Children
    {
        int a;
        int id;
    };
    bool cmp(Children x, Children y)
    {
        return x.a < y.a;
    }
    Children child[100005];
    int h[100005];
    int ans[100005];
    
    int main()
    {
        int n, m, p = 0;    //p用来记录上一个孩子摘到哪个了
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &child[i].a);
            child[i].id = i;
        }
        for (int i = 0; i < m; i++)
        {
            scanf("%d", &h[i]);
        }
        sort(child, child + n, cmp);
        sort(h, h + m); //为气球排序
        for (int i = 0; i < n; i++)
        {
            while (p < m && h[p] <= child[i].a)
            {       //摘掉该气球
                ans[child[i].id]++;
                p++;
            }
        }
        for (int i = 0; i < n; i++)
        {
            printf("%d\n", ans[i]);
        }
        return 0;
    }
    //max{O(nlog(n)),O(mlog(m)),O(n+m)}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web框架:Iris快速入门

web框架&#xff1a;Iris快速入门 1 介绍及安装 介绍 Iris是一款用Go开发的web应用框架&#xff0c;被称为速度最快的Go后端开发框架。官网地址&#xff1a;https://www.iris-go.com/中文教程地址&#xff1a;http://www.codebaoku.com/iris/iris-index.html 安装 环境要求&a…

QTableView编程——Model/View架构(单元格随意拖拽交换)

QTableView编程——Model/View架构 基础知识 添加表头 //准备数据模型QStandardItemModel *student_model new QStandardItemModel();student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));student_model->setHorizontalHea…

【Redis】Redis位图(bitmap)介绍和在签到场景的应用

文章目录 一、前言二、redis位图相关指令setbit命令getbit命令bitcount命令bitfield命令bitpos命令bitop命令 三、应用场景累计签到应用场景连续签到应用场景日期签到场景应用详情 一、前言 基本原理&#xff1a; 《Redis设计与实现》中对位图的实现描述是&#xff1a;Redis使…

做软件测试我该如何快速摸清一家公司的基本情况?

当你准备进入一家新的公司作为软件测试人员时&#xff0c;了解公司的基本情况对于你快速适应新环境和工作非常重要。下面是几个方面可以帮助你快速摸清一家公司的基本情况&#xff1a; 如果你想学习软件测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站…

8. 高性能业务表结构设计和索引知识深化

MySQL性能调优 1. 数据库表设计1.1 范式化设计1.1.1 什么是范式&#xff1f;1.1.2 第一范式&#xff08;1NF&#xff09;1.1.2 第二范式&#xff08;2NF&#xff09;1.1.3 第三范式&#xff08;3NF&#xff09; 1.2 反范式设计1.2.1 什么叫反范式化设计 1.3 范式化和反范式总结…

分析SpringBoot 底层机制【Tomcat 启动分析+Spring 容器初始化+Tomcat 如何关联Spring 容器之源码分析

目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器之源码分析 搭建SpringBoot 底层机制开发环境 创建Maven 项目wyx-springboot 修改pom.xml , 导入相关依赖 创建MainApp.java 启动项目ok, 大家注意Tomcat 也启动了[这里思考, …

机器学习期末复习 BP神经网络的推导,4X4X3,激活函数变为Logistic函数,其他不变

刚写完了bp神经网络的实验课代码&#xff0c;对这个比较熟悉&#xff08;后面给出实现代码&#xff09; Logistic函数也就是sigmod函数&#xff0c;表达式是这样的&#xff1a; def sigmod(x):return 1/(1math.exp(-x)) sigmod函数是隐层和输出层的激活函数&#xff08;sigmo…

如何本地搭建Plex私人影音云盘教程,实现Plex家庭影音中心,打造超级多媒体中心

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章&#xff1a;免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问…

WEBPACK、VITE 常用配置(对照)及迁移指南

文中 Webpack 版本为 5.x&#xff0c;Vite 版本为 4.3.x webpack 是新一代构建工具里面的老大哥了&#xff0c;从 2013 年发布已经持续升级 10 年&#xff0c;形成完备的生态环境。vite 则是下一代前端开发与构建工具&#xff0c;2019年发布&#xff0c;最新发布版本 4.3.3&…

文件操作安全之-文件上传告警运营篇

本文从文件上传的定义&#xff0c;文件上传的IDS规则&#xff0c;文件上传的示例&#xff0c;文件上传的告警研判&#xff0c;文件上传的处置建议等几个方面阐述如何通过文件上传类型的告警的线索&#xff0c;开展日常安全运营工作&#xff0c;从而挖掘有意义的安全事件。 文件…

rtl仿真器-iverilog icarus安装和测试

Icarus Verilog是一个轻量、免费、开源的Verilog编译器&#xff0c;基于C实现&#xff0c;开发者是 Stephen Williams &#xff0c;遵循 GNU GPL license 许可证&#xff0c;安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真&#xff0c;命令行操作方式&#xff0c…

C语言函数大全-- _w 开头的函数(1)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _waccess 1.1 函数说明 函数声明函数功能int _waccess(const wchar_t* path, int mode);用于测试文件或目录是否存在&#xff0c;并检查程序是否具有对它们的访问权限 参数&#xff1a; path &#xff1a; 待测试的…

Elasticsearch(三)

Elasticsearch(三) 数据聚合 聚合的分类 文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类&#xff1a; 桶聚合&#xff1a;用来对文档做分组 Te…

【P22】JMeter 调试后置处理程序(Debug PostProcessor)

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 线程&#xff08;用户&#xff09;<<< 线程组 默认参数即可 &#xff08;2&#xff09;、线程组右键 <<< 添加 <<< 取样器 <<< 调试取样器 默认参数即可 &…

SQL复习(一)——安装

1 mysql卸载 reference&#xff1a;https://blog.csdn.net/m0_67392273/article/details/126066580 Step1:停止MySql服务 在卸载之前&#xff0c;先停止MySQL8.0的服务 搜索“服务”&#xff0c;找到“MySQL”&#xff0c;右键点击选择“停止” Step2&#xff1a;软件的卸…

Unittest自动化测试之unittestunittest_生成测试报告

unittest_生成测试报告 测试报告为测试结果的统计即展示&#xff0c;是自动化测试不可或缺的一部分&#xff0c;利用unittest 可以生成测试报告 方式一、使用第三方 HTMLTestRunner 执行测试用例集&#xff0c;生成网页版测试报告&#xff08;推荐&#xff09; HTMLTestRunn…

5年软测经验去面试25k测试岗,看到这样的面试题我还是心虚了....

我是着急忙慌的准备简历——5年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;5年测试经验起码能要个25K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;自信满满去面试&#…

系统掌握入河排污口设置论证技术、方法及报告编制框架

在短时间内较系统的掌握入河排污口设置论证技术、方法及报告编制框架&#xff0c;学习内容以城镇生活污水厂、造纸项目、石化项目、制药项目案例为线索&#xff0c;系统讲解入河排污口设置论证报告书编制过程&#xff0c;并以水质模型为手段&#xff0c;讲解水质影响预测模型的…

Voice Control for ChatGPT 沉浸式的与ChatGPT进行交流学习。

Voice Control for ChatGPT 日常生活中&#xff0c;我们与亲人朋友沟通交流一般都是喜欢语音的形式来完成的&#xff0c;毕竟相对于文字来说语音就不会显的那么的苍白无力&#xff0c;同时最大的好处就是能解放我们的双手吧&#xff0c;能更快实现两者间的对话&#xff0c;沟通…