Messenger in MAC

首先来看看官方解答

当确定了一个选出的数之后,我们a的和肯定就定了,我们肯定要将b的和变得最小是最优的,很容易想到的一个策略就是将b从小到大排序,然后b的和就等于bmaxbmin

这其实是正确的。官方解答没有给出证明,我来证明一下。首先将b看做数轴上的点,比如下图

然后这种做法就相当于bibi1这一段距离被覆盖而且刚好被覆盖一次

我们考虑其他的任何一种排法,肯定是不存在bibi1这一段距离没有被覆盖的,因为你不可能分成两个不连通的块

所以最开始的排法既是下界又可以达到,当然就是最优的

于是我们枚举blbr,此时有

所以当我们固定了一个r之后,我们指针向前面走,实时维护一个set或优先队列,用一个变量记录里面所有元素的和,注意到bl是在递减的,所以当我们加入一个新的a之后,如果超出l了,我们直接弹出最大值就好了

然后再来看看我的做法,当然仍然是按照b排序先,然后利用动态规划,设f[i][j][0/1]表示前i个数,选出了j个数,第i个数是否选择的最小时间(注意这里利用一个经典trick,就是利用数组的值去存储时间而不是某一维度去存储时间,因为时间太大了)

方程很好推,也很好优化,就不推了

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