2.22 —— 949C

949 C#

限时每日一题day2。这一次做出来了,但时间花得有点多,再接再厉吧。

一个不难的构造题。

首先能发现 以任意两个非 1 的相邻两数为端点 形成区间的答案 与 其他位置的答案 是独立的,因此问题转化为给定两个正数 x,y,中间夹着若干个 1,能否正确填充。

将数看作二进制,则题目给定的三个操作本质上可看作:

  1. 向右移一位
  2. 向左移一位,末尾填0
  3. 向左移一位,末尾填1

x,y 的前导0去除,然后再取 x,y 的高位公共前缀,对两个数剩下的若干低位操作,可以证明这样的操作次数是最少的。

有解的前提是操作数要足够,即 1 的数量要够;其次要满足做完上述操作后剩下的操作次数是偶数,才能保持这种构造形式(若剩下奇数次,则最终状态一定改变),否则一定无解。

对所有这样的 x,y 检验即可,前缀与后缀的 1 显然可以直接构造;而操作可以只用上面的操作 1,以简化构造过程。具体细节见代码。

code

posted @   jxs123  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩