发布时间:2026/7/1 9:00:32
PTA L2-009 抢红包题解:用C++结构体+运算符重载搞定复杂排序(附完整代码)
PTA L2-009 抢红包题解C结构体与运算符重载实战指南在编程竞赛和在线判题系统中处理复杂数据排序是常见考点。PTA平台的L2-009抢红包题目就是一个典型的多条件排序问题要求我们不仅要计算每个人的净收入还要按照特定规则排序输出。这类题目考察的核心能力包括结构体设计与数据组织多条件排序规则的实现浮点数精度处理运算符重载的应用1. 题目分析与数据结构设计这道题目要求统计N个人之间互相发红包、抢红包的记录最终按照以下规则排序输出收入金额从高到低金额相同时按抢到红包的个数递减前两项都相同时按个人编号递增1.1 关键数据结构我们需要设计一个结构体来存储每个人的相关信息struct Person { int id; // 个人编号 int count; // 抢到红包的次数 double money; // 净收入金额单位分 };这里有几个设计要点使用double存储金额因为题目要求最终输出两位小数金额以分为单位存储避免浮点数运算带来的精度问题单独记录抢红包次数为后续排序做准备1.2 输入处理逻辑题目输入格式为N K N1 P1 ... NK PK ...处理输入时需要注意每个人可能既是发红包者也是抢红包者每次发红包都会影响两个人的金额发红包者减少抢红包者增加同一个人发出的红包每人最多只能抢1次2. 运算符重载实现多条件排序2.1 排序规则分析题目要求的排序规则可以分解为主要排序键money降序次要排序键count降序第三排序键id升序2.2 运算符重载实现在C中我们可以通过重载运算符来实现自定义排序bool operator(const Person other) const { // 比较金额考虑浮点精度 if (fabs(money - other.money) 1e-4) { return money other.money; // 降序 } // 金额相同比较抢红包次数 if (count ! other.count) { return count other.count; // 降序 } // 前两者相同比较ID return id other.id; // 升序 }关键点说明使用fabs比较浮点数设置合理的精度阈值(1e-4)注意不同排序键的升降序要求运算符重载使得我们可以直接使用std::sort进行排序2.3 浮点数精度处理浮点数比较是这类题目常见的坑点。直接使用比较浮点数通常不可靠应该// 不推荐 if (money other.money) // 推荐 if (fabs(money - other.money) 1e-4)精度阈值的选择要根据题目要求本题中金额输出到小数点后2位所以1e-4的精度足够。3. 完整代码实现与解析下面给出完整的解决方案包含详细注释#include cstdio #include algorithm #include cmath const int MAX_N 10010; struct Person { int id; int count; double money; bool operator(const Person other) const { if (fabs(money - other.money) 1e-4) { return money other.money; } if (count ! other.count) { return count other.count; } return id other.id; } } people[MAX_N]; int main() { int n; scanf(%d, n); // 初始化每个人的ID for (int i 1; i n; i) { people[i].id i; } // 处理每个人的发红包记录 for (int i 1; i n; i) { int k; scanf(%d, k); while (k--) { int receiver; double amount; scanf(%d%lf, receiver, amount); // 接收者增加金额和计数 people[receiver].money amount; people[receiver].count; // 发送者减少金额 people[i].money - amount; } } // 排序 std::sort(people 1, people n 1); // 输出结果转换为元为单位 for (int i 1; i n; i) { printf(%d %.2f\n, people[i].id, people[i].money / 100); } return 0; }3.1 代码关键点解析数组初始化使用1-based索引更符合题目编号习惯初始化时设置每个人的ID输入处理外层循环处理每个人的发红包记录内层循环处理每个红包的接收者和金额金额计算接收者money amount,count发送者money - amount排序与输出使用std::sort配合重载的运算符输出时金额除以100转换为元单位4. 常见问题与调试技巧4.1 常见错误浮点数精度问题错误直接比较浮点数相等解决使用fabs和精度阈值排序规则错误错误忽略次要排序条件解决严格按照题目要求实现所有排序条件数组越界错误使用0-based索引但题目是1-based解决数组大小设为N1从1开始使用4.2 调试技巧小规模测试使用题目提供的样例输入验证构造边界情况如所有人金额相同中间输出在处理完输入后输出每个人的金额和计数验证数据读取和计算是否正确排序验证在排序后输出中间结果检查排序是否符合预期规则4.3 性能优化虽然本题N≤10^4数据量不大但良好的编程习惯包括使用scanf/printf比cin/cout更快对于大量数据输入输出有明显优势避免不必要的操作只在必要时进行浮点数比较减少循环中的冗余计算合理使用数据结构本题使用数组足够更复杂情况可考虑更高效的数据结构5. 类似题型扩展掌握了这道题的解法和思路后可以解决许多类似的排序问题5.1 多条件排序问题这类问题的通用解法设计包含所有需要排序字段的结构体根据题目要求重载运算符或编写比较函数注意各排序条件的优先级和升降序5.2 浮点数处理问题涉及金额、分数等需要精确计算的场景确定合适的精度阈值避免直接相等比较考虑是否可以使用整数运算代替5.3 实际应用场景类似的排序需求在实际开发中很常见电商平台的商品排序销量、价格、评分学生成绩排名总分、单科成绩、学号竞赛排名解题数、用时、队伍编号6. 最佳实践与经验分享在解决这类排序问题时有几个实用技巧统一比较函数 除了运算符重载也可以单独写比较函数bool compare(const Person a, const Person b) { if (fabs(a.money - b.money) 1e-4) return a.money b.money; if (a.count ! b.count) return a.count b.count; return a.id b.id; }测试用例设计设计所有人金额相同的情况设计金额和抢红包次数都相同的情况设计极端数据如最大N值代码复用 将排序逻辑封装成通用模板方便类似题目使用templatetypename T void multiSort(vectorT data) { sort(data.begin(), data.end()); }调试输出 在开发过程中添加调试输出帮助理解程序行为#define DEBUG #ifdef DEBUG printf(Debug: person %d money%.2f count%d\n, id, money, count); #endif在实际编程竞赛中这类排序问题出现的频率很高。建议熟练掌握结构体设计、运算符重载和排序规则实现这些都是解决更复杂问题的基础。

相关新闻

空洞骑士模组管理器Scarab:5个步骤快速上手终极指南
2026/7/1 9:00:32

空洞骑士模组管理器Scarab:5个步骤快速上手终极指南

空洞骑士模组管理器Scarab:5个步骤快速上手终极指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的繁琐流程而烦恼吗?Scar…

阅读更多
Java毕设项目:基于 SpringBoot+Vue 的剧本杀门店经营统计管理系统的设计与实现 基于 SpringBoot+Vue 的剧本杀预约核销服务平台 (源码+文档,讲解、调试运行,定制等)
2026/7/1 9:00:32

Java毕设项目:基于 SpringBoot+Vue 的剧本杀门店经营统计管理系统的设计与实现 基于 SpringBoot+Vue 的剧本杀预约核销服务平台 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
ServerPackCreator终极指南:自动化Minecraft服务器包生成工具
2026/7/1 9:00:32

ServerPackCreator终极指南:自动化Minecraft服务器包生成工具

ServerPackCreator终极指南:自动化Minecraft服务器包生成工具 【免费下载链接】ServerPackCreator Create a server pack from a Minecraft Forge, NeoForge, Fabric, LegacyFabric or Quilt modpack! 项目地址: https://gitcode.com/gh_mirrors/se/ServerPackCre…

阅读更多
3分钟零风险永久激活Microsoft 365:Ohook Office激活终极指南
2026/7/1 10:00:32

3分钟零风险永久激活Microsoft 365:Ohook Office激活终极指南

3分钟零风险永久激活Microsoft 365:Ohook Office激活终极指南 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh…

阅读更多
Steam自动破解工具完整指南:如何快速离线运行Steam游戏
2026/7/1 10:00:32

Steam自动破解工具完整指南:如何快速离线运行Steam游戏

Steam自动破解工具完整指南:如何快速离线运行Steam游戏 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam-auto-crack是一款功能强大的Steam游戏自动破解工具&#xff0…

阅读更多
终极指南:5分钟掌握百度网盘直链解析,免费享受高速下载
2026/7/1 10:00:32

终极指南:5分钟掌握百度网盘直链解析,免费享受高速下载

终极指南:5分钟掌握百度网盘直链解析,免费享受高速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘非会员的龟速下载而烦恼吗&#…

阅读更多
ChatGPT SSL证书错误排查:从原理到实战解决指南
2026/7/1 10:00:32

ChatGPT SSL证书错误排查:从原理到实战解决指南

1. 项目概述:当ChatGPT遇上SSL证书错误如果你正在使用ChatGPT,无论是网页版、桌面应用还是通过API集成,突然弹出一个“SSL证书错误”或“连接不安全”的红色警告,那种感觉就像在高速公路上突然爆胎。页面加载失败、对话中断、API调…

阅读更多
AI写代码工具怎么选?2024年开发者必须掌握的5大评估维度与避坑指南
2026/7/1 10:00:32

AI写代码工具怎么选?2024年开发者必须掌握的5大评估维度与避坑指南

更多请点击: https://codechina.net 第一章:AI写代码工具推荐 近年来,AI辅助编程工具已深度融入开发者日常流程,显著提升编码效率与代码质量。以下工具均经过真实项目验证,支持主流语言、IDE集成及本地/云端双模式运行…

阅读更多
在 Windows 11 上从源码编译安装 Winloop (uvloop 高性能事件循环) 保姆级实战指南
2026/7/1 9:00:32

在 Windows 11 上从源码编译安装 Winloop (uvloop 高性能事件循环) 保姆级实战指南

🚀 在 Windows 11 上从源码编译安装 Winloop (uvloop 高性能事件循环) 保姆级实战指南 一、 踩坑背景与动机 如果你在 Windows 下开发异步 Python 项目,并试图追求极致性能安装官方的 uvloop,你大概率会被下面这个报错无情拒载:…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/6/30 17:40:54

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/6/30 17:40:17

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/1 0:00:31

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/1 0:00:31

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/1 0:00:31

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/1 0:00:31

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/1 0:00:31

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/1 0:00:31

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多