【“小白致命坑”】[特殊字符] 备战蓝桥杯C++:别再写嵌套循环了!一招掌握 STL 结构体多级排序
【“小白致命坑”】 备战蓝桥杯C别再写嵌套循环了一招掌握 STL 结构体多级排序在备战蓝桥杯的过程中我们经常会遇到一类非常经典的排序题比如历年真题中的“奖学金”问题“先按总分从高到低排总分相同按德育排德育相同按智育排全都相同按学号从小到大排…”面对这种多重条件的限制很多新手同学的第一反应是噩梦然后开始开好几个数组存成绩、存学号接着写极其恐怖的双层for循环试图手动去处理“分数相同”的情况。这不仅代码量巨大、极其容易写出 Bug而且完全丧失了 C STL 的优势。今天我来教大家如何用 C 的结构体 (struct) 自定义排序 (cmp)把几十行的嵌套循环压缩成一行魔法代码在考场上秒杀这类问题❌ 新手最容易踩的两个大坑坑一剥离了数据的灵魂拆分数组很多初学者喜欢这么写vectorintscore(n);// 存总分vectorintdeyu(n);// 存德育vectorintid(n);// 存学号诊断一个人的信息是一个整体如果你把它们拆进不同的数组里一旦你交换了其中一个数组的位置其他数组的数据就全乱套了张三的总分对上了李四的学号。坑二画蛇添足的嵌套循环排序有些同学知道用sort但不知道怎么处理并列情况于是写出了这种令人窒息的操作sort(score.begin(),score.end());// 先排总分for(inti0;in;i){for(intji;jn;j){if(score[i]score[j]){// 试图手动在总分相同的人里面再做一次排序...}}}诊断完全不需要在 C 里std::sort就像一个极其聪明的秘书。你只需要告诉她“两个人站在一起谁应该排在前面”她就会自动帮你把几万人的队伍排得明明白白。 破局核心打包数据与“瀑布流”比较法第一步用 Struct 打包数据把一个人的所有属性捆绑在一起这才是面向对象的思维structstudent{intid;// 学号inta;// 德育intb;// 智育intc;// 体育intscore;// 总分};// 注意结尾分号第二步编写神级cmp函数瀑布流判断法这是整个排序的灵魂。不需要写长串的直接利用!进行拦截像瀑布一样一层一层往下流boolcmp(student x,student y){// 优先级 1总分不同总分高的排前面 (返回 x y)if(x.score!y.score)returnx.scorey.score;// 优先级 2总分相同了如果德育不同德育高的排前面if(x.a!y.a)returnx.ay.a;// 优先级 3德育也相同如果智育不同智育高的排前面if(x.b!y.b)returnx.by.b;// 优先级 4智育也相同如果体育不同体育高的排前面if(x.c!y.c)returnx.cy.c;// 优先级 5所有成绩都一样看学号学号小的排前面returnx.idy.id;} 终极满分模板掌握了上面的核心我们来看看完整的 AC 代码有多么优雅。遇到任何多级排序问题直接套用这个模板#includebits/stdc.husingnamespacestd;structstudent{intid,a,b,c,score;};// 瀑布流比较函数boolcmp(student x,student y){if(x.score!y.score)returnx.scorey.score;if(x.a!y.a)returnx.ay.a;if(x.b!y.b)returnx.by.b;if(x.c!y.c)returnx.cy.c;returnx.idy.id;}intmain(){// 蓝桥杯起手式防止 IO 超时ios::sync_with_stdio(false);cin.tie(0);intn;cinn;// 使用 vector 存储结构体vectorstudentstudents(n);// 读入数据并计算总分for(inti0;in;i){cinstudents[i].astudents[i].bstudents[i].c;students[i].idi1;// 学号按输入顺序生成students[i].scorestudents[i].astudents[i].bstudents[i].c;}// ✨ 魔法时刻一行代码搞定所有复杂的排序规则sort(students.begin(),students.end(),cmp);// 输出前 5 名的信息for(inti0;i5;i){coutstudents[i].id students[i].score students[i].a students[i].b students[i].c\n;}return0;}总结学会把数据装进struct并用带有多个if (!)的自定义cmp函数配合sort使用是蓝桥杯拿奖必备的基础素养。告别嵌套循环让你的代码跑得又快又稳
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419448.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!