PTA团体程序设计天梯赛L2真题讲解L2-017-020

📅 2026/8/11 16:34:15
PTA团体程序设计天梯赛L2真题讲解L2-017-020
官网https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7文章目录L2-017 人以群分L2-018 多项式A除以BL2-019 悄悄关注L2-020 功夫传人L2-017 人以群分题目大意根据活跃度将人群分为内向型活跃度低和外向型活跃度高两类要求两类人数尽可能接近且总活跃度的差值尽可能大。输出两类的人数与总活跃度差值的绝对值。解题思路将所有活跃度从小到大排序前半部分划分为内向型后半部分划分为外向型。该划分方式能保证在人数最接近的前提下两组总活跃度的差值最大。人数分配规则总人数为偶数时两组人数相等总人数为奇数时外向型人数比内向型多1人多的一人归入高活跃度组可最大化差值。分别计算两组的活跃度总和差值为外向总和减去内向总和。正解代码#includebits/stdc.h#defineintlonglongusingnamespacestd;constintN1e59;intn,a[N],sum1,sum2;signedmain(){cinn;for(inti1;in;i)cina[i];sort(a1,a1n);for(inti1;in/2;i)sum1a[i];for(intin;in/2;i--)sum2a[i];printf(Outgoing #: %lld\n,n-n/2);printf(Introverted #: %lld\n,n/2);printf(Diff %lld\n,sum2-sum1);return0;}代码解析对活跃度数组升序排序前n/2个元素求和为内向组总活跃度剩余元素求和为外向组总活跃度。内向组人数为n/2外向组人数为n - n/2天然满足奇数人数时外向组多一人的规则。使用long long存储总和避免数据溢出。L2-018 多项式A除以B本题为高难度模拟题赛场建议放弃优先保证其他题目的得分。L2-019 悄悄关注题目大意给定用户的关注列表和点赞记录筛选出“不在关注列表中、且点赞次数大于所有点赞平均次数”的用户按用户ID字母序升序输出若无符合条件的用户输出Bing Mei You。解题思路用集合存储所有关注用户ID实现快速查询某个用户是否在关注列表中。读入全部点赞记录累加总点赞次数计算平均点赞数。遍历所有点赞用户筛选出满足「不在关注列表」且「点赞次数 平均值」的用户。将筛选结果按ID字典序升序排序后输出结果为空则输出指定提示字符串。正解代码#includebits/stdc.husingnamespacestd;intn,k;doublesum;string s;setstringst;structno{string id;doublelk;booloperator(no others)const{returnlkothers.lk;}}a[10010];intmain(){cinn;for(inti0;in;i){cins;st.insert(s);}cink;for(inti0;ik;i){cina[i].ida[i].lk;suma[i].lk;}sum/k;sort(a,ak);boolfd0;vectorstringv;for(intik-1;i0;i--){if(a[i].lksum)break;if(!st.count(a[i].id)){fd1;v.push_back(a[i].id);}}sort(v.begin(),v.end());//按ID字母序输出for(inti0;iv.size();i)coutv[i]\n;if(!fd)coutBing Mei You;return0;}代码解析用setstring存储关注列表查询时间复杂度为O(logN)效率较高。结构体存储每个点赞用户的ID和点赞次数遍历筛选符合条件的用户存入vector。对结果vector调用sort利用string的默认字典序比较规则完成排序。用标记变量记录是否存在符合条件的用户控制最终输出内容。L2-020 功夫传人题目大意祖师爷编号0初始功力为Z武功每向下传承一代功力减弱 r%若弟子为“得道者”其功力会放大指定倍数。计算所有得道者的功力总和只保留整数部分。解题思路师门谱系是典型的多叉树结构使用DFS遍历整棵树即可。从根节点祖师爷出发初始功力为Z。每递归到下一层徒弟功力乘以折扣系数(100 - r) / 100。若当前节点是得道者直接计算其最终功力并累加到总和不再向下递归得道者无徒弟。正解代码#includebits/stdc.h#defineintlonglongusingnamespacestd;constintN1e59;vectorintv[N];intb[N];boolst[N];intn;doubleans,z,r;voiddfs(intid,doubleeg){if(st[id]){ansb[id]*eg;return;}for(inti0;iv[id].size();i){dfs(v[id][i],eg*(100-r)/100);}}signedmain(){cinnzr;doubleeg;egz;for(inti0;in;i){intx;cinx;if(x!0)for(intj0;jx;j){inty;ciny;v[i].push_back(y);}else{inty;ciny;st[i]1;b[i]y;}}dfs(0,eg);cout(int)ans;return0;}代码解析用vectorint数组存储每个人的徒弟列表构建树结构。布尔数组标记是否为得道者数组存储得道者的功力放大倍数。DFS函数接收当前节点编号与当前功力值遇到得道者则累加答案并返回否则遍历所有徒弟递归传递衰减后的功力值。最终结果强制转换为int按题目要求截断取整。