Distance Learning Courses in MAC

这道题目其实我们如果位运算的题目有取值范围的话(这道题目的[x,y]),我们可以统计公共前缀

首先对于一个数对(xi,yi)(假设xiyi),我们先统计他们的最长公共前缀

比如000110101000111000,他们的最长公共前缀就是000110000(位数都是32位,这里省略了,公共前缀之后的位用0补齐)

那么在最终的选择中,公共前缀这些位一定要是一样的(比如上面举的例子,低的四位不知道怎么填写,但是高的五位一定是00011),所以我们将xy减去这个公共前缀再去考虑剩下的位

这个时候考虑区间[l,r]的每一个数(仍然是从高位到低位逐位考虑),如果此时所有的y(减去了公共前缀的,下文都是)在这个位上都是0,那么肯定没办法操作(此时所有[l,r]的课程都还处于公共前缀,没办法操作);如果只有一个y在这个位上是1(即当前考虑的这一位刚好有一个课程刚好跳出最长公共前缀),那么我们再来考虑除了当前课程的公共前缀,如果存在某个公共前缀在这一位上是1,那么肯定我们可以把这唯一的一个y在这个位上赋值为0,然后把之后的位全部赋值成1(这个操作是可行的,因为这一个位置刚好是这个y跳出最长公共前缀的时候,也就是说y的这一位为1x的这一位为0,由于我们赋的值在当前位为1,所以小于y,而后面的值都是1,所以不小于x)肯定是最优的,如果不存在这样的公共前缀,那么根据贪心,我们肯定是把这一个y的这一位赋值为1;如果有两个及以上的y在这一位是1,我们仍然可以将这一位及其之后的位全部变成1

代码有细节,见注释

update 2024.7.18

重新做一遍这道题目,做出来啦

关键还是考虑最长公共前缀

posted @   最爱丁珰  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示