[学生代码修改] P14361社团招新

发布时间:2026/8/22 22:42:06

[学生代码修改] P14361社团招新
一、这道题真正的贪心思路假设有 4 个人每个人先选择自己满意度最高的部门。假如最终三个部门人数部门13人 部门21人 部门30人因为n4n 4n4每个部门最多222人。所以部门 1 多了111个人。我们必须把部门 1 的某个人调到其他部门。这时候应该找从最大满意度换成第二大满意度时损失最小的人。例如某A对3个部门的满意度如下部门1100 部门299 部门320那么从部门1调到部门2损失100−991损失 100 - 99 1损失100−991B对3个部门的满意度如下部门1100 部门250 部门330调走损失100−5050100 - 50 50100−5050显然应该优先调A。所以损失最大值−次大值损失 最大值 - 次大值损失最大值−次大值把超员部门所有人的损失从小到大排序然后取需要调走的那些人即可。二、原代码逐个错误分析你的结构体struct R{ int a,b,c; int mx,mi,mxi; int zxh,hxh,bxh;变量大概想表达变量含义a,b,c三个部门的满意度mx最大满意度mi最小满意度mxi中间的满意度也就是次大值zxh最大值所在部门hxh中间值所在部门bxh最小值所在部门错误 1最大值相同时zxh会被覆盖源代码if(mxa) zxh1; if(mxb) zxh2; if(mxc) zxh3;比如a10 b10 c5执行if(mxa) zxh1;此时zxh1但是继续if(mxb) zxh2;最后变成zxh2虽然这种情况下选部门 1 或部门 2 都可以但写法会产生覆盖。更严重的是a10 b10 c10最后zxh3这虽然还能勉强表示一个选择但你后面的hxh、bxh就彻底乱了。三、错误 2最小值同样会被覆盖你写if(mia) bxh1; if(mib) bxh2; if(mic) bxh3;例如10 5 5最后bxh3而不是唯一的部门。源代码hxh6-bxh-zxh;就不一定正确。四、错误 3hxh6-bxh-zxh依赖三个值必须不同例如a10 b10 c10可能得到zxh3 bxh3于是hxh6-3-3;得到hxh0;部门根本不存在。所以这段hxh6-bxh-zxh;不能这样写。五、错误 4不应该按照最大、第二大、最小依次给人分配原代码最核心的问题。if(r[j].zxh1an/2) { sumr[j].mx; a; }然后if(r[j].hxh1an/2) { sumr[j].mxi; a; }再if(r[j].bxh1an/2) { sumr[j].mi; a; }源代码的意思实际上是这个人如果第一志愿部门满了就尝试第二志愿再不行尝试第三志愿。但题目不是要求按输入顺序在线决定。真正应该第一步所有人先选择最大值。第二步统计三个部门人数。第三步如果某个部门超过n/2n/2n/2只从这个部门的人里面挑人调走而且挑最大值−次大值最大值 - 次大值最大值−次大值最小的人。六、错误 5 n/2写错了你写if(r[j].zxh1an/2)假设n4 n/22当a2你的条件a2仍然成立。然后a;结果a3部门 1 就有 3 个人了。题目要求的是人数≤n/2人数 \leq n/2人数≤n/2如果准备继续加入一个人那么应该判断an/2a n/2an/2而不是a≤n/2a \leq n/2a≤n/2七、错误 6写错变量了源代码if(r[j].bxh3cn/2) { sumr[j].mi; a; }这里判断的是c说明想给第 3 部门加人。但是最后写成了a;应该是c;八、错误 7没有处理超员以后重新调整比如n4如果最优选择以后部门13 部门21 部门30那么部门1必须调走1个人。原代码是在读取每个人的时候就决定if(...)但是你不知道后面的人会不会导致某个部门超员。所以应该先全部选最大值 ↓ 统计人数 ↓ 发现部门1超员 ↓ 重新从部门1里面挑人这就是所谓的先贪心再调整。九、错误 8mxi的意义其实是次大值你写mxiabc-mx-mi;数学上确实可以得到中间值。例如4 2 1那么421−4−12421-4-12421−4−12得到mxi2这个计算本身没有问题。但是由于前面的zxh bxh hxh在出现相等值的时候可能错误所以后面不能可靠地知道mxi究竟属于哪个部门不过其实这题根本不需要知道次大值属于哪个部门。因为调走以后直接去次大满意度对应的部门即可。而且那个部门一定不会超过n/2n/2n/2。十、为什么调到次大部门一定安全这是这道题最重要的一个结论。假设部门 1 超过n/2n/2n/2比如n10 部门16 部门23 部门31我们从部门1调人。部门2和部门3原本加起来314314314而454 545所以即使我们把人调到部门2部门2最多变成5部门2最多变成5部门2最多变成5也不会超过n/2n/2n/2。因此只要某个部门超过n/2n/2n/2那么其他两个部门都不可能超过n/2n/2n/2。这也是为什么我们只需要把超员部门的人调到他的次大满意度部门即可。十一、修改后的代码按照原代码的格式继续使用结构体继续使用数组变量尽量保留源代码的风格#includebits/stdc.husingnamespacestd;constintI1e55;//测试数据组数intt;//学生人数intn;//最终答案longlongsum;//每个学生的信息structR{inta,b,c;//三个部门的满意度intmx;//最大满意度intmi;//最小满意度intmxi;//次大满意度intzxh;//最大值所在的部门};//保存每个人的信息R r[I];/* 按照最大值-次大值从小到大排序 这个值代表 如果这个人原本选择满意度最高的部门 现在把他调到第二满意的部门 总满意度会损失多少。 损失越小越应该优先调走。 */boolcmp(R x,R y){returnx.mx-x.mxiy.mx-y.mxi;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cint;while(t--){//初始化sum0;//三个部门当前人数inta0;intb0;intc0;cinn;/* 第一步 暂时不考虑部门人数限制。 每个人直接选择自己满意度最高的部门。 */for(intj1;jn;j){cinr[j].ar[j].br[j].c;//求最大值r[j].mxmax(r[j].a,max(r[j].b,r[j].c));//求最小值r[j].mimin(r[j].a,min(r[j].b,r[j].c));/* 三个数的和 -最大值 -最小值 就等于中间的那个数也就是次大值。 */r[j].mxir[j].ar[j].br[j].c-r[j].mx-r[j].mi;/* 确定这个人原本选择哪个部门。 如果出现相同最大值 选择其中任意一个都可以。 使用/else if 保证只选择一个部门。 */if(r[j].ar[j].br[j].ar[j].c){r[j].zxh1;a;}elseif(r[j].br[j].ar[j].br[j].c){r[j].zxh2;b;}else{r[j].zxh3;c;}//先把每个人的最大满意度加入答案sumr[j].mx;}/* 第二步 判断三个部门有没有超过n/2。 因为三个部门总人数只有n 所以不可能有两个部门同时超过n/2。 因此最多只有一个部门超员。 */intbad0;if(an/2)bad1;elseif(bn/2)bad2;elseif(cn/2)bad3;/* 如果bad0 说明三个部门人数都没有超过n/2 当前所有人选择最大值的方案 本身就是最优答案。 不需要进行任何调整。 */if(bad0){coutsumendl;continue;}/* 第三步 找到了超员部门。 例如 n10 部门17 部门22 部门31 那么部门1必须调走 7-52 个人。 我们只需要从原本选择部门1的人里面 找最大值-次大值最小的人。 因为 最大值-次大值 损失越小越好。 *///对所有人按照最大值-次大值排序sort(r1,rn1,cmp);//需要从超员部门调走多少人intneed;if(bad1)needa-n/2;elseif(bad2)needb-n/2;elseneedc-n/2;/* 第四步 按照损失从小到大 从超员部门中选择need个人调走。 */for(intj1;jnneed0;j){//只处理原本属于超员部门的人if(r[j].zxhbad){/* 这个人从最大满意度 换成次大满意度 所以答案减少 mx-mxi */sum-r[j].mx-r[j].mxi;need--;}}//输出最终答案coutsumendl;}}十二、代码核心其实只有这几步① 每个人先选最大值 ↓ ② 统计三个部门人数 ↓ ③ 找有没有部门 n/2 ↓ ④ 如果没有直接输出 ↓ ⑤ 如果有 找这个部门多出来多少人 ↓ ⑥ 计算每个人 最大值 - 次大值 ↓ ⑦ 从小到大排序 ↓ ⑧ 取最小的几个 ↓ ⑨ 从答案中减掉这些损失也就是先让所有人选第一志愿如果第一志愿的人太多就把改去第二志愿损失最小的人调走。这就是这题的核心。十三、原代码和 AC 代码最大的区别原来的思路是第1个人来了 ↓ 能去最大就去最大 ↓ 不行就去第二大 ↓ 再不行去最小 第2个人来了 ↓ 继续这样判断这是边读边分配。而正确思路是所有人先选最大 ↓ 统计结果 ↓ 发现部门1超员 ↓ 回头看部门1的所有人 ↓ 找最大-次大最小的人 ↓ 把这些人调走也就是原来的代码是边走边决定正确代码是先做最优初始方案再进行全局调整。十四、再特别提醒一个容易误解的地方原来专门记录zxh hxh bxh其实这题不需要记录次大值所在的部门。我们只需要知道mx // 最大值 mxi // 次大值 zxh // 最大值属于哪个部门就够了。因为当某部门超员以后这个人从最大值部门调走 ↓ 直接去次大值对应的部门不需要知道它具体是部门 1、2 还是 3。所以我把你的hxh bxh删掉了代码反而更简单也避免了最大值/最小值相等时部门编号混乱的问题。这题的时间复杂度是O(nlog⁡n)O(n \log n)O(nlogn)主要来自排序n≤105n \leq 10^5n≤105可以轻松通过。

相关新闻

5个配置项,给Paperless-ngx装上多语言:中文界面、OCR识别与日期解析一次配齐

5个配置项,给Paperless-ngx装上多语言:中文界面、OCR识别与日期解析一次配齐

2026/8/22 22:42:06

5个配置项,给Paperless-ngx装上多语言:中文界面、OCR识别与日期解析一次配齐 【免费下载链接】paperless-ngx A community-supported supercharged document management system: scan, index and archive all your documents 项目地址: https://gitcod…

从光源到成像:浙江虹烁科技的机器视觉检测解决方案

从光源到成像:浙江虹烁科技的机器视觉检测解决方案

2026/8/22 22:32:06

随着制造业自动化程度不断提高,机器视觉已经从过去简单的有无判断,逐渐进入微小缺陷识别、尺寸测量、材料内部检测以及复杂表面检测等更加精细的应用阶段。 在很多视觉检测项目中,相机和算法往往最受关注,但真正决定图像质量的&am…

QQ空间数据备份,5分钟搬回自己电脑

QQ空间数据备份,5分钟搬回自己电脑

2026/8/22 22:32:06

QQ空间数据备份,5分钟搬回自己电脑 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 不备份,空间记录找不回 账号一被封,空间里的历史说说、留言和互动…

绣花机振动超标隔振治理科普

绣花机振动超标隔振治理科普

2026/8/22 23:42:09

在绣花加工行业生产中,很多工厂会遇到特殊的振动问题:设备运行稳定、刺绣针脚均匀、成品质量完全达标,但厂房楼板持续晃动、窗户振颤,进而引发周边居民投诉,最终造成停工停产。不少从业者对此存在疑惑:设备…

Playnite游戏库管理器:免费整合20+游戏平台的终极指南

Playnite游戏库管理器:免费整合20+游戏平台的终极指南

2026/8/22 23:42:09

Playnite游戏库管理器:免费整合20游戏平台的终极指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: http…

免费使用Plus Jakarta Sans开源字体:5步快速上手的完整步骤

免费使用Plus Jakarta Sans开源字体:5步快速上手的完整步骤

2026/8/22 23:42:09

免费使用Plus Jakarta Sans开源字体:5步快速上手的完整步骤 【免费下载链接】PlusJakartaSans Jakarta Sans is a open-source fonts. Designed for Jakarta "City of collaboration" program in 2020. 项目地址: https://gitcode.com/gh_mirrors/pl/Pl…

iPad 协议微信机器人完整上手:5 分钟跑通微信自动回复

iPad 协议微信机器人完整上手:5 分钟跑通微信自动回复

2026/8/22 23:42:09

iPad 协议微信机器人完整上手:5 分钟跑通微信自动回复 【免费下载链接】wechat-robot-ipad iPad协议的微信机器人 项目地址: https://gitcode.com/gh_mirrors/we/wechat-robot-ipad 微信消息回复、群成员管理、好友验证,这些重复操作正在吃掉你的…

大模型与算法备案奖励申请全攻略:步骤详解与材料清单

大模型与算法备案奖励申请全攻略:步骤详解与材料清单

2026/8/22 23:42:09

一、前言:为什么现在都在抢着申请备案奖励? 随着《生成式人工智能服务管理暂行办法》等法规落地,AI大模型合规备案已成为人工智能企业开展业务的法定前置要求。 与此同时,为鼓励企业主动合规,全国多地政府陆续推出备案…

一名员工+多个AI Agent,工作方式正在被重写

一名员工+多个AI Agent,工作方式正在被重写

2026/8/22 23:32:08

观察企业里用AI用得好的那批员工,会发现一个共同点:他们不再把AI当工具开开关关,而是身边常驻着几个各管一摊的Agent,就像身边坐着几位各司其职的助手,随叫随到也各守本分。做供应链计划的,一个Agent盯库存…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/21 21:41:19

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/22 11:09:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/22 11:09:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

2026/8/22 0:00:52

1. 从宏观到微观:多尺度智能体控制的核心挑战在智能体(Agent)技术日益普及的今天,我们面临着一个越来越普遍的难题:如何同时管理成千上万个,甚至百万级别的智能体?无论是城市交通中的自动驾驶车…

CUBE标准:统一AI智能体评测的度量衡与架构解析

CUBE标准:统一AI智能体评测的度量衡与架构解析

2026/8/22 0:00:52

1. 项目概述:为什么我们需要一个统一的智能体评测标准?最近在折腾各种AI智能体项目,从简单的自动化脚本到复杂的多模态交互系统,我发现了一个让人头疼的共性问题:评测。每次开发完一个智能体,想看看它到底行…

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

2026/8/22 0:00:52

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…