PTA团体程序设计天梯赛L1真题讲解L1-093-096 📅 2026/8/14 21:09:04 官网https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7文章目录L1-093 猜帽子游戏L1-094 剪切粘贴L1-095 分寝室L1-096 谁管谁叫爹L1-093 猜帽子游戏题目大意给定 n 顶帽子的颜色1 代表黑色、2 代表黄色以及多组宝宝的猜测结果0 表示弃权1/2 表示猜测颜色。获奖规则为所有人都没有猜错且至少有一人猜对。判断每组猜测能否获奖能则输出Da Jiang!!!否则输出Ai Ya。核心思路逐组遍历猜测结果同时校验两个核心条件是否存在错误猜测、是否存在正确猜测。一旦发现错误猜测直接判定失败遍历结束后若全对且至少一人猜对则获奖。算法步骤读入帽子数量 n 与对应颜色数组。读入询问组数逐个处理每组猜测初始化标记无错误标记为 true正确猜测计数为 0。逐个位置对比猜测值与真实颜色猜测值非 0 且与真实值不等 → 标记失败直接跳出循环。猜测值与真实值相等 → 正确计数加 1。遍历结束后若无错误且正确计数大于 0输出获奖否则输出失败。正解代码#includebits/stdc.husingnamespacestd;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intn,a[110];cinn;for(inti0;in;i){cina[i];}intx;cinx;while(x--){boolfd1;intb[110],cnt0;for(inti0;in;i){cinb[i];}for(inti0;in;i){if(b[i]a[i])cnt;if(b[i]!0b[i]!a[i]){fd0;coutAi Yaendl;break;}}if(cnt0fd1)coutDa Jiang!!!endl;if(cnt0fd1)coutAi Yaendl;}return0;}代码关键细节遇到错误猜测可提前终止遍历优化效率同时避免后续逻辑误判。弃权值为 0既不算正确也不算错误不影响两个判定条件。全员弃权的场景正确计数为 0自然落入失败分支符合规则。L1-094 剪切粘贴题目大意对初始字符串执行多次剪切粘贴操作。每次操作先剪切指定区间位置从 1 开始编号的子串并从原串删除再根据给定的前后标识字符串寻找插入位置将剪切内容插入两者之间找不到匹配位置则追加到字符串末尾。求所有操作后的最终字符串。核心思路纯模拟操作。每次操作分两步先按位置提取并删除子串再拼接前后标识串查找插入点完成插入。利用字符串原生的查找、删除、插入方法实现。算法步骤读入初始字符串与操作次数。对每次操作读取剪切左右边界、插入位置前串、插入位置后串。提取剪切的子串注意下标从 1 转为 0长度为r-l1。删除原串中对应位置的内容。拼接前后标识串作为查找目标在当前串中查找首次出现的位置。找到则将剪切子串插入到前标识串之后未找到则追加到字符串末尾。全部操作完成后输出最终字符串。正解代码#includebits/stdc.husingnamespacestd;voidso(strings){intl,r;string s1,s2,y,z;cinlrs1s2;zs1;zs2;ys.substr(l-1,r-l1);s.erase(l-1,r-l1);if(s.find(z)!string::npos){s.insert(s.find(z)s1.size(),y);}elsesy;}intmain(){string s;cins;intq;cinq;while(q--){so(s);}couts;return0;}代码关键细节题目位置从 1 开始C 字符串下标从 0 开始剪切起始下标需减 1。插入位置在前、后标识串之间因此找到匹配起始位置后需加上前串长度才是插入点。string::find默认返回第一个匹配位置天然符合“选最靠近开头的插入位置”的要求。L1-095 分寝室题目大意给定女生人数、男生人数和总寝室数需满足男女不混住、不能单人一间、同性别每间寝室人数相同。在所有合法方案中选择男女每间寝室人数差最小的方案输出女生寝室数与男生寝室数无解则输出No Solution。核心思路枚举女生寝室数量对应得到男生寝室数量逐一校验合法性。在所有合法方案中记录每间人数差最小的方案最终输出结果。算法步骤读入女生人数 n、男生人数 m、总寝室数 x。初始化最小人数差为极大值标记是否存在合法方案。枚举女生寝室数 i 从 1 到 x-1对应男生寝室数为 x-i合法性校验女生人数能被寝室数整除、男生人数能被寝室数整除且每间人数大于 1即人数 寝室数。合法则计算每间人数差的绝对值若小于当前最小值更新最小值与答案。枚举结束后有合法方案则输出女生、男生寝室数无则输出无解。正解代码#includebits/stdc.husingnamespacestd;intn,m,x,mi1e8;intmain(){cinnmx;inta0,b0;boolfd0;if(n1||m1||x1){coutNo Solution;return0;}for(inti1;ix;i){if(nim(x-1)n%i0m%(x-i)0){fd1;intcntabs(n/i-m/(x-i));if(cntmi){micnt;ai;bx-i;}}}if(!fd){coutNo Solution;return0;}elsecouta b;return0;}代码关键细节女生寝室数范围为 1 ~ x-1保证男女都至少分配 1 间寝室避免除以 0。题目保证解唯一找到差值最小的方案即为最终答案无需处理并列情况。总寝室必须全部分完因此男女寝室数之和必须等于 x。L1-096 谁管谁叫爹题目大意每轮游戏 A、B 各给出一个正整数分别计算两数的各位数字之和。判定规则若 A 的原始数字能被 B 的各位和整除则 A 是爹若 B 的原始数字能被 A 的各位和整除则 B 是爹。若两人同时满足或同时不满足则原始数字更大的是爹。输出每轮的获胜者。核心思路先实现各位数字求和的工具函数再按规则分情况判定。先判断两个整除条件再根据满足情况决定胜负平局时比较原始数字大小。算法步骤编写函数输入一个整数返回其各位数字相加之和。读入游戏轮数每轮读取 A、B 两个数字。计算 sa A 的各位和sb B 的各位和。判定逻辑仅 A 满足整除条件 → A 获胜。仅 B 满足整除条件 → B 获胜。同时满足或同时不满足 → 原始数字大的一方获胜。输出对应获胜者。正解代码#includebits/stdc.husingnamespacestd;intsolve(intx){intcnt0;while(x0){cntx%10;x/10;}returncnt;}intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intn;cinn;while(n--){inta,b;cinab;intcsolve(a),dsolve(b);if(a%d0){//A满足if(b%c0){//同时满足if(ab)coutAendl;elsecoutBendl;}elsecoutAendl;}else{if(b%c0)coutBendl;else{if(ab)coutAendl;elsecoutBendl;}}}return0;}代码关键细节数字不超过 9 位使用 int 类型即可存储无溢出风险。各位和通过循环取模、整除实现直到数字变为 0。题目保证两数不相等平局时无需处理相等情况。