2024蓝桥杯省赛C/C++程序设计A组题目简析

2024蓝桥杯省赛C/C++程序设计A组题目简析

A

题意:计算一段区间内日期的中文表达的总笔画数>50的天数

按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。

B

题意:5×5的棋盘下五子棋,最终下满棋盘并和棋的情况数

dfs或者遍历二进制去枚举棋子位置的情况均可。

假设做法是去枚举黑棋位置的所有情况,一个简单的验证对错的方法是把黑棋的数量分别设置为12/13运行一次,如果答案不等说明写错了。

C

题意:有 n 个士兵,第 i 个士兵至少需要训练 bi 次,每次训练花费 ai。可以每次花钱训练一个士兵,也可以花费 S 将所有士兵训练一次。求将所有士兵训练达标的最小代价。(n2×105

比较明显的贪心算法。先将士兵按照 bi 排序,也就是越后面的士兵需要的训练次数越多。从第一个士兵开始往后遍历,做到 x 时,如果 ax+ax+1++an>S,那么打包训练更优,做 bxbx1 次打包训练(bxbx1 为总共需要次数减去已经执行过的打包训练数);否则,单独训练已经优于打包,直接让答案加上 [x,n] 区间内每个士兵剩下需要单独训练的次数 × 训练花费,并退出循环。复杂度 O(nlogn).

D

题意:有两棵大小分别为 n,m 的以 1 为根的树,每个节点有权值,分别为 ai,bi。起初两个人 A,B 分别站在两棵树的根节点,两人各自一路往下走直到叶子节点,设 A 经过的结点的权值按照顺序组成序列 ak1,ak2,ak3...B 的序列为 bl1,bl2,bl3,求两个序列的最长公共前缀的可能最大值。(n,m2×105, ai,bi109)

题目转化为:对于第一棵树上的每个节点 x,能否在第二棵树上找到一条一样的从根节点向下的权值路径。

需要快速判断两个序列是否一样,使用哈希函数。先dfs第二棵树,在递归时记录当前节点到根节点 1 这一段的哈希值,设节点 x1 这一段的哈希值为 px

然后dfs第一棵树,记录当前节点的深度和哈希值,设节点 y1 这一段哈希值为 qy,每次只需要看看集合 {px} 里是否有 qy,如果有,说明存在相同路径,答案与 y 的深度取 max

复杂度 O(nlogn)

E

题意:给定一个序列 a1,a2an,求出最小的 x,使得能够选出 a1,a2ax 中的 k 个,使得这 k 个数的方差小于 T

n105,ai105,T109

x 的可行性单调(即 x 增长,成功的概率递增),可以二分 x 得出答案。问题转变成如何判定前 x 个数是否可行,即求出前 x 个数中选出 k 个的最小方差。

为了让方差最小,一定选取排序后相邻的 k 个数。所以有效的选法只有 xk+1 种。将方差的式子拆分括号,变成 i=1kxi2i=1kxik,得到独立的两个部分,于是只需分别记录 i=1kxi2i=1kxi,当区间从 [p,p+k1] 变成 [p+1,p+k]O(1) 地修改两个值,就可以算出方差的最小值,进而判定是否可行。

复杂度 O(nlog2n) 。可改用倍增避开每次判定的暴力排序优化为 O(nlogn)

F

题意:给定一棵 n 个节点的树,树上的节点 x 的颜色为 cx。有 q 次询问,每次给出两个节点 a,b,问在 a,b 之间的树上路径上的节点有多少种不同的颜色。

n105,ci20,q105

几乎是树链剖分的模板题。由于颜色的种类很少,只需对每种颜色 p 开一个数组统计 dfs序上的颜色为 p 的结点个数的前缀和,在剖出的每条树链上看看每种颜色有没有即可。

复杂度 O(20 nlogn)

G

题意:给定序列 x1,x2,xn,四元组 (a,b,c,d) 是好的当且仅当 xaxb 整除,xcxd 整除且 a,b,c,d 互不相等。问有多少个好的四元组。

n105,ai105

观察到 ai 的范围并不大,可以用 O(ai) 的方法枚举出每个数的因子,然后通过一些数组进行统计,不难得到 Ca:满足 ab, xb|xab 的数量。

如果没有 a,b,c,d 不等的条件,只需要考虑 a,c 的组合,b,d 的情况为 Ca×Cd, 总的答案也很好算。

a,b,c,d 不能相等,考虑容斥。先按照 a,c 不等,其它随意算出答案 ans1,然后减去 ac,b=d 的数量 ans2,再减去 ac,bd,a=d 的数量 ans3ac,bd,b=c 的数量 ans4,最后发现 ac,a=d,b=c 的被减了两次,算出这部分的数量 ans5。最后答案为 ans1ans2ans3ans4+ans5ans2,3,4,5 的计算都类似,不赘述。

容斥的过程稍微有点繁琐,考场上写了对拍,大概是对的。但没考虑到最后答案会超出 long long 的范围......得用 int128 或者用两个 long long 拼接小小地高精度一下。

H

题意:有 n 个魔法球和 n 个空盒子,第 i 个魔法球的魔法值为 ai。现在要将球装入盒子中,每个盒子最多装一个,也可以空着,每个球也最多放入一个盒子中,且相邻的盒子不能放魔法值相同的球。初始体力值为 k,将第 i 个球装入第 j (ji) 个盒子中消耗 ij 体力值。最后放了球的盒子权值 vx 为球的魔法值,没放球的盒子 vx=1,在保证体力值 0 的情况下请移动球使得 v1,v2,v3...vn 的字典序最大。

做法挺简单暴力。让字典序最大,自然从 1 开始往后遍历。遍历到 x 时,需要找到 [x,x+k] 区间内没被装掉的球里最大的且在所有最大的球里最靠左的那个(尽量节省体力),并把它装入 x。用线段树维护区间最大值以及区间最大值所在最左端的位置即可,每次执行区间查找、单点修改操作。

但是相邻的两个不能相同,所以还得维护严格次大值和严格次大值最左端的位置,只是让区间合并变得更复杂一些。

复杂度 O(nlogn)

本文作者:-敲键盘的猫-

本文链接:https://www.cnblogs.com/whx666/p/18142018

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   -敲键盘的猫-  阅读(622)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
历史上的今天:
2021-04-17 Codeforces Round #607 (Div. 1)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起