题目
初始有两个长为n(n<=1e5)的可重集合a和b,第i个数分别是ai,bi(0<=ai<=1e9,0<=bi=1e9)
你可以执行以下两种操作若干次:
1. 从A集合中选一个数x出来,令x变为2x后,再放回A集合
2. 从A集合中选一个数x出来,令x变为x/2向下取整后,再放回A集合
问让A和B两个集合完全相同的最小操作次数,如果不能实现输出-1
思路来源
AtCoder Beginner Contest 254 A-Ex - 知乎
题解
典中典问题
cf好像后来也出过一个,只是好像要输出具体方案,但是思路是一致的
如果A和B集合能完全相同,a和b一定存在一组一一映射关系,
不妨ai最后映射上的数是bj,且ai执行过第一种乘2操作,
那么,可以视为bj执行了一次除以2操作,前提是bj需要是偶数
将两种新操作改写为,
1. 从B集合中选一个偶数x出来,令x变为x/2,再放回B集合
2. 从A集合中选一个数x出来,令x变为x/2向下取整后,再放回A集合
这样两种操作就是对称的,并且数是只会变小的,所以就可以贪心地从最大数开始考虑了
使两个集合完全相同,等价于一对一对消去,能将两个集合消除空
记a集合中的最大数为mxa,b集合中的最大数为mxb
①若mxa=mxb,成对消除
②若mxb>mxa
(1)若mxb为奇数,不能操作,输出-1
(2)若mxb为偶数,mxb/2后放回,记一次操作
③若mxa>mxb,mxa/2后放回,

这篇博客讨论了一个经典问题,如何通过特定操作使得两个可重集合A和B变得相同。题目中给出了两种操作:将集合A中的数翻倍并放回,或将其减半(向下取整)并放回。解析表明,当两个集合能够相等时,它们之间存在一对一的映射关系。通过贪心策略,从最大数值开始进行操作,可以找到使两个集合相同的最小操作次数。文章提供了详细的思路和C++代码实现。
最低0.47元/天 解锁文章
717

被折叠的 条评论
为什么被折叠?



