算法学习【模拟算法】洛谷P1786 - 帮贡排序

2024 - 10 - 13 - 30 篇 - C++、模拟算法、洛谷、蓝桥
作者(Author): 郑龙浩 / 仟濹(CSDN 账号名)

【模拟算法】洛谷P1786 - 帮贡排序

1. 题干:

目前帮派内共最多有一位帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众若干。

现在absi2011要对帮派内几乎所有人的职位全部调整一番。他发现这是个很难的事情。于是要求你帮他调整。

他给你每个人的以下数据:他的名字(长度不会超过30),他的原来职位,他的帮贡,他的等级。

他要给帮贡最多的护法的职位,其次长老,以此类推。

可是,乐斗的显示并不按帮贡排序而按职位和等级排序。

他要你求出最后乐斗显示的列表(在他调整过职位后):职位第一关键字,等级第二关键字。

注意:absi2011无权调整帮主、副帮主的职位,包括他自己的(这不是废话么…)

他按原来的顺序给你(所以,等级相同的,原来靠前的现在也要靠前,因为经验高低的原因,但此处为了简单点省去经验。)

输入输出格式

输入格式

第一行一个正整数n,表示星月家园内帮友的人数。

下面n行每行两个字符串两个整数,表示每个人的名字、职位、帮贡、等级。

输出格式

一共输出n行,每行包括排序后乐斗显示的名字、职位、等级。

输入输出样例

输入样例

9
DrangonflyKang BangZhu 100000 66
RenZaiJiangHu FuBangZhu 80000 60
absi2011 FuBangZhu 90000 60
BingQiLingDeYanLei HuFa 89000 58
Lcey HuFa 30000 49
BangYou3 ZhangLao 1000 1
BangYou1 TangZhu 100 40
BangYou2 JingYing 40000 10
BangYou4 BangZhong 400 1输出样例

输出样例

DrangonflyKang BangZhu 66
RenZaiJiangHu FuBangZhu 60
absi2011 FuBangZhu 60
BingQiLingDeYanLei HuFa 58
BangYou2 HuFa 10
Lcey ZhangLao 49
BangYou1 ZhangLao 40
BangYou3 ZhangLao 1
BangYou4 ZhangLao 1代码

2. 我的唠叨:

此题用了我好久的时间才做出来

原先我写的代码使用的函数过多,我想把一些很细的地方也用函数写出来,虽然实现了模块化,但是复杂度增加了,并且极大的增加了出错误的概率,并且改错也不是很好改。所以后来还是决定将函数去掉,写到main函数中去吧。

比如之前想把下面这个代码变为函数

for( int i = 1; i <= num; i ++ ){
        if( i == 1 ) data[ i ].jobs = "BangZhu";
        else if( i == 2 || i == 3 ) data[ i ].jobs = "FuBangZhu";
        else if( i == 4 || i == 5 ) data[ i ].jobs = "HuFa";
        else if( i >= 6 && i <= 9 ) data[ i ].jobs = "ZhangLao";
        else if( i >= 10 && i <= 16 ) data[ i ].jobs = "TangZhu";
        else if( i >= 17 && i <= 41 ) data[ i ].jobs = "JingYing";
        else data[ i ].jobs = "BangZhong";
    }

其实做了好久,主要是总是会有一些地方不小心就写错了,测试点总是不完全对。

而这个做题思路是在洛谷题解看了某位大佬才会的。

题解的链接:https://www.luogu.com.cn/problem/solution/P1786

3. 思路:

  1. 定义、输入(人员数量、人员信息)

  2. 第一次排序 –> 【帮贡】第一关键字,【输入顺序(隐含条件)】第二关键字

    • 若【帮贡】相同,按照【输入顺序n】排序 –> 【输入顺序n】小的在前
    • 若【帮贡】不同,按照【帮贡】大小排序 – > 帮贡大的在前
  3. 第二次排序 –> 【职务】第一关键字,【等级】第二关键字,【输入顺序(隐含条件)】第三关键字

    • 若【职务】相同 && 【等级】相同,则按照【输入顺序n】排序 –> n 小的在前

    • 若【职务】相同 && 【等级】不同,则按照【等级】排序 –> 【等级】大的在前

    • 若【职务】不同,则按照【职务】排序 –> 【职务】牛的在前

      关于这个地方就要注意了,因为职务是字符串,所以不能直接比较,不然比较的就是字符串的字母顺序了,所以要自己单数写一个change函数,将【职务】进行【数字化】,这样就可以将【职务】转为【数字】进行比较了

  4. 打印 人员信息

下面是正确的代码:

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;
// 存储人员信息
struct ddd{
    string name, jobs;
    long long bg;
    int grade, n;
};

// 将职务 -> 数字的转换函数 -- > 为了在排序时用职位进行排序
int change( string a){
    if( a == "BangZhu" ) return 0;
    if( a == "FuBangZhu" ) return 1;
    if( a == "HuFa" ) return 2;
    if( a == "ZhangLao" ) return 3;
    if( a == "TangZhu" ) return 4;
    if( a == "JingYing" ) return 5;
    if( a == "BangZhong" ) return 6;
    return -1;
}

// 第1个排序的【比较函数】
int campare_1( ddd a, ddd b ){
    if( a.bg == b.bg ) return a.n < b.n; // 若【帮贡】相等,按照【输入顺序】排序 --> n 小的在前
    else return a.bg > b.bg; // 若【帮贡】不相等,按照【帮贡】降序排序 --> 帮贡大的在前
}

// 第2个排序的【比较函数】
int campare_2( ddd a, ddd b ){
    if( change( a.jobs ) == change( b.jobs ) ) 
        if( a.grade == b.grade ) return a.n < b.n; // 若【职务】相等&&【等级】相等,按照【输入顺序n】排序 --> n 小的在前
        else return a.grade > b.grade; // 若【职务】相等&&【等级】不等,按照【等级】降序排序 --> 等级高的在前
    else return change( a.jobs ) < change( b.jobs ); // 若【职务】不相等,按照【职务】升序排序 --> 职务低的在前
}

// 打印 人员信息
void print_da( ddd *data, int num ){
    for( int i = 1; i <= num; i ++ ){
        cout << data[ i ].name << " " << data[ i ].jobs << " " << data[ i ].grade << endl;
    }
}
int main( void ){
    ddd data[ 120 ];// 存储人员信息
    int num; // 人数
    cin >> num; // 输入 人数

    for( int i = 1; i <= num; i ++ ){ // 输入 人员信息
        cin >> data[ i ].name >> data[ i ].jobs >> data[ i ].bg >> data[ i ].grade;
        data[ i ].n = i;
    }

    // 第一次排序 --> 
    // 按照【帮贡】降序排序 --> 【帮贡】大的在前
    // 若【帮贡】相等,按照【输入顺序】排序 --> 【输入顺序n】 小的在前
    sort ( data + 4, data + num + 1, campare_1 ); 
    // 对排序后的信息进行重新授予【职务】
    for( int i = 1; i <= num; i ++ ){
        if( i == 1 ) data[ i ].jobs = "BangZhu";
        else if( i == 2 || i == 3 ) data[ i ].jobs = "FuBangZhu";
        else if( i == 4 || i == 5 ) data[ i ].jobs = "HuFa";
        else if( i >= 6 && i <= 9 ) data[ i ].jobs = "ZhangLao";
        else if( i >= 10 && i <= 16 ) data[ i ].jobs = "TangZhu";
        else if( i >= 17 && i <= 41 ) data[ i ].jobs = "JingYing";
        else data[ i ].jobs = "BangZhong";
    }
    // 第二次排序 -->
    // 按照【职务】升序排序 --> 【职务】牛逼的在前(change 函数返回的值越小,则证明【职务】越牛逼)
    // 若【职务】相等,按照【等级】降序排序 --> 【等级】高的在前
    // 若【职务】和【等级】都相等,按照【输入顺序n】排序 --> 【输入顺序n】 小的在前
    sort ( data + 1, data + num + 1, campare_2 );
    // 打印 人员信息
    print_da( data, num );
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dockerhub镜像加速

一、背景 dockerhub由于被封锁和站点处于国外的原因&#xff0c;docker pull拉取镜像非常慢&#xff0c;有时候直接都无法拉取。严重妨碍了我们的学习进度以及日常使用。 总结了一些proxy代理的镜像站点&#xff0c;配置之后速度会有明显提升&#xff0c;大家可以参考使用。 二…

Linux: C语言解析域名

在上一篇博客 Linux: C语言发起 DNS 查询报文 中&#xff0c;自己构造 DNS 查询报文&#xff0c;发出去&#xff0c;接收响应&#xff0c;以二进制形式把响应的数据写入文件并进行分析。文章的最后留下一个悬念&#xff0c;就是写代码解析 DNS answer section 部分。本文来完成…

Tri Mode Ethernet MAC IP核详解

本文对 Vivado 的三速 MAC IP 核&#xff08;Tri Mode Ethernet MAC&#xff0c;TEMAC&#xff09;进行介绍。 在自行实现三速以太网 MAC 控制器时&#xff0c;GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现&#xff0c;然而实际使用中自己实现的模块性能不是很稳定&#xff08…

CENTOS7 升级gcc版本

升级gcc版本 CentOS下升级gcc版本有两个途径&#xff0c;一个是添加其他源进行自动升级&#xff0c;一个是手动编译升级&#xff0c;这里先顺便讲下自动升级的两个办法&#xff1a; a. 添加Fedora源 在 /etc/yum.repos.d 目录中添加文件 FedoraRepo.repo &#xff0c;并输入…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作&#xff0c;于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github &#xff0c;要使用Docker拉去镜像等外部网络资源&#xff0c;因此产…

学习日记_20241123_聚类方法(高斯混合模型)续

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

15.C++STL 2(string类的使用,6000字详解)

⭐本篇重点&#xff1a;string类的使用 ⭐本篇代码&#xff1a;c学习/05.string类的学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. C/C字符与string类 二. STL中的string类的使用 2.1 string类常见的构造与赋值 2.2 string对象的数据容量操作 …

神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络简介 神经网络&#xff08;Neural Networks&#xff09;是受生物神经系统启发而设计的数学模型&#xff0c;用于模拟人类大脑处理信息的方式。它由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0…

shell 基础知识2 ---条件测试

目录 一、条件测试的基本语法 二、文件测试表达式 三、字符串测试表达式 四、整数测试表达式 五、逻辑操作符 六、实验 为了能够正确处理 Shell 程序运行过程中遇到的各种情况&#xff0c; Linux Shell 提供了一组测试运算符。 通过这些运算符&#xff0c;Shell 程序能够…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…

Flutter-Web首次加载时添加动画

前言 现在web上线后首次加载会很慢&#xff0c;要5秒以上&#xff0c;并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.找到web/index.html文件 2.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;…

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法&#xff0c;凭借其独特的结构和训练方式&#xff0c;在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用&#xff0c;深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

RabbitMQ3:Java客户端快速入门

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

element dialog 2层弹窗数据同步问题

注意&#xff1a;本帖为公开技术贴&#xff0c;不得用做任何商业用途 element dialog 2层弹窗数据同步问题 如果嵌套dialog&#xff0c;也就是多层dialog嵌套 2个input&#xff0c;key用同样的值 会导致内外2层dialog&#xff0c;用相同key值的input会数据同步 原因如下&a…

C# 属性 学习理解记录

字段和属性 左边字段&#xff0c;右边属性 拓展&#xff0c;属性安全&#xff1a; 1、设置public private 和protected 等&#xff0c;只读&#xff0c;只写&#xff0c; 2、在get set 方法时&#xff0c;验证&#xff0c;异常时抛出错误

如何提取某站 MV 视频中的音乐为 MP3 音频

我们常常会遇到需要将视频中的音频提取出来并转换为 MP3 格式的情况&#xff0c;比如想要单独保存一段视频中的精彩音乐、演讲或旁白。简鹿视频格式转换器就是一款能够轻松实现这一需求的实用软件&#xff0c;它支持 Windows 和 Mac 系统&#xff0c;为不同操作系统的用户提供了…

SQLynx让数据库变得简单!

SQLynx让数据库管理和开发变得更简单&#xff0c;SQLynx是一款旨在简化飞客使用体验的创新型工具&#xff0c;它为数据库管理者、数据库分析师和开发人员提供了一个直观、易用、高效的平台&#xff0c;首先&#xff0c;SQLynx拥有直观友好的用户界面。无论您是新建还是导表&…