思维题 9 道 题解
A 数字天平 题解
题目标签:思维题
解答思路
由题意可知,若所有的
备注
这是一道很简单也很明显的思维题,没有算法需求,故不放出代码。
B 简单题 题解
题目标签:思维题
解答思路
过于氵了,看到题目以为是数论,结果发现直接输出 3 个
备注
这是一道很简单也很明显的思维题,没有算法需求,故不放出代码。
C 纸牌游戏 题解
题目标签:思维题 预处理 STL
解题思路
看到题面,题意很简单,把双方的牌分成数量相同的两组,分别应用不同的判胜规则,求出最大获胜局数。但是看到暴力枚举的时间复杂度为
首先考虑手牌的分配策略,即,我们应该怎么分配上下半场的手牌来使得能取到最优解。很显然,对于持续了
那我们在这种分配方案的基础上,尝试将每一种分割上下半场的方案的最大胜场求出,即很容易得到,我们只需要求出
现在问题转化为了如何求取
到这里不难看出,最后我们需要维护一个数据结构,能够先其中放入我们的手牌,从其中查询是否存在能取胜的牌,并且在使用这张牌后删去它避免二次使用,于是我们选择了 C++ STL
库中的set
内置容器来实现,set
的原理是红黑树,感兴趣可以自行了解。
最后总结求解逻辑:以求前缀最优(大牌获胜的半场)为例:我们先把自己手上的牌全部加入 set,然后遍历对方出牌顺序,每次看看这次加进去的牌能不能多完成一次获胜,就是去找对面容器里的上确界 upper_bound
,如果找到,就把对面的那张牌从 set
里删掉;对下半场执行同样的操作,得到所有 set
执行插入,查找,删除的复杂度均为
备注
此题稍难,但由于没有评测条件,且没有算法需求,故不放出代码。
D 巡视王国 题解
题目标签:思维题
由题意易得,每次删去两个节点,则对于奇数个结点的图一定无解,而对于偶数个节点的图,因为不存在重边和自环,所以这
备注
这是一道很简单也很明显的思维题,没有算法需求,故不放出代码。
E 数学考试 题解
题目标签:思维题 数学 容斥原理
解题思路
看到了题面,思考后发现所有的条件之间均不互相矛盾,所以如果要暴力计算的话要考虑
定义
设
即
证明
对于每个元素使用二项式定理计算其出现的次数。对于元素
于是每个元素出现的次数为 1,那么合并起来就是并集。证毕。
对于这个问题中的容斥原理的应用,就应该考虑所谓的每种属性应该是什么:如果将方案对于这
同时用
所以我们可以通过这种办法,把全部的
F 区间 题解
题目标签:思维题 线段树
解题思路
看到这道题,要求实现修改和区间求和,很容易想到线段树实现,但是这道题的修改是一个开平方的操作,不想加法或乘法那样可以批量处理整个区间,所以想过去觉得不好办,但是思考后发现
简单介绍线段树算法:
概念
线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。
线段树可以在
线段树将每个长度不为
如果要求修改区间
懒惰标记,简单来说,就是通过延迟对节点信息的更改,从而减少可能不必要的操作次数。每次执行修改时,我们通过打标记的方法表明该节点对应的区间在某一次操作中被更改,但不更新该节点的子节点的信息。实质性的修改则在下一次访问带有标记的节点时才进行。
备注
此题由于没有评测条件,故不放出代码。
G 图计算 题解
题目标签:思维题 并查集 哈希表
解题思路
由于是无向图,所以求联通点对只需用用并查集溜一遍然后套公式就好了,问题的关键是怎么处理这些加边操作,对于每一条边开数组肯定炸空间,每加一个去查前面加进来的边会爆时间。需要存储小量的大范围数,那不就是哈希表吗?做法很明显:开一个哈希表,每次把新的边存到表中,如果这条边尚不存在,那就检查这次加边之后是否在全部的图中都存在,如果是,则标记为已存在并且更新答案。
备注
此题由于没有评测条件,故不放出代码。
H 纸盒糖果 题解
题目标签:思维题
解题思路
很简单的一道题,对于第一和第二盒这一对,如果其中糖果之和不满足条件,则优先将第二盒的糖果拿出(不能小于零
备注
这是一道很简单也很明显的思维题,没有算法需求,故不放出代码。
I 幸运数 题解
题目标签:思维题 数学
解题思路
最 “思维” 的一道题,最后的解法非常简单:对于给定的参数 d 和原数字(n 位数)a 的话,将它直接乘上 2*10^10,可以得到一个(至少)n+10 位数 A,并且 A 一定大于 B=123456789d9...9(后面补上 n 个 9,凑齐 n+10 位
备注
这是一道很简单但是不很明显的思维题,没有算法需求,故不放出代码。