分数规划

0-1分数规划

问题模型

给定两个长度为n的数组a,b 求一个序列x[i]\in 0,1,使得ans={\displaystyle\sum_{i=1}^{i \leq n}a[i]\times x[i]\over \displaystyle\sum_{i=1}^{i \leq n}b[i]\times x[i]}最大。其实就是选若干个i出来,分别累加a[i]b[i]使他们的商最大。 做法就是,我们假定一个数字L={\displaystyle\sum_{i=1}^{i \leq n}a[i]\times x[i]\over \displaystyle\sum_{i=1}^{i \leq n}b[i]\times x[i]},变形,可以得到L\times \displaystyle\sum_{i=1}^{i \leq n}b[i]\times x[i] - \displaystyle\sum_{i=1}^{i \leq n}a[i]\times x[i]= 0

\displaystyle\sum_{i=1}^{i\leq n}(b[i]*L-a[i])*x[i]\geq 0,很明显,如果我们能够找到一组解x[i],使得上面这个式子成立,可以推导得到这一组解能够使得

L\leq {\displaystyle\sum_{i=1}^{i \leq n}a[i]\times x[i]\over \displaystyle\sum_{i=1}^{i \leq n}b[i]\times x[i]}成立,也就是,存在一组解,使得答案大于L这个确定的值。也就是说,我们能够验证一个确定数值是否能够作为最大的答案,如果他能,我们就找不到这样的一组解,如果能,我们就能找到。这其实就是二分答案的思想。L就是我们二分的答案。

 

这个做法很巧妙。分数是一个很难处理的东西,它把这个东西拆开了,这是一个很好的思路。而原本的拆开是看似没有意义的,但是其实对于二分答案这种做法来说,是有的,这是很特殊的一个地方。很多时候,最优解的问题可以被转化为验证性质的问题。

 

例题:最优秀比率生成树 poj2976

生成树和分数规划的结合。 实际上分数规划经常和图论结合,可能是因为分数规划实际上是把“代价”这个东西转化为了一个。。奇怪的东西,就是上面说的L,它是答案,但是不是传统的代价的形式,因为它不能像传统的代价一样通过简单的加减来得到其他情况下的代价。而是能够找到是否存在更大的答案。这个就是和二分答案强绑定的了。

总之,在我现在看来,分数规划和二分答案就是强绑定的,分数规划似乎都是能够套用二分答案的这种做法的。

其实这个生成树和其他的生成树的区别就在于,它边权可以说是随着L的变化而变化的,我们每次要做的就是在这种情况下找到最小的生成树,然后验证是否小于0。 其实我感觉最小生成树的贪心是需要解释一下是否成立的。 如果我们计算完最小生成树,发现得到的答案小于L,那就说明,存在一种生成树,使得最终答案小于L。 “生成树”这种限制似乎是可以改变的,比如我换一下,换成至少取k条边,那就是一道新题目了。 但是这种取值不需要遵从某种条件吗?似乎是总能验证答案是否成立啊,二分答案需要的单调性总是被保证了的? 有没有一种情况,更小的L能够成立,而无法验证? 可以发现,我们的验证总是在贪心的取值,而最小生成树刚刚好就是贪心可以得到的,那假如,我们的取值要求是贪心无法做到的要求,是需要要dp或者其他的方式才能得到最优解的呢? 分数规划的形式规定了最后的答案需求,假定L是最优解,可以得到的式子是一样的。我们上面说的情况就是,我们的x[i]不在是任意取的了,那么,这个时候取到的序列x[i],是否还能够用来检测是否有更优秀的答案呢? 似乎是很显然的。肯定是可以的,我们这个式子只是要求取最小的\displaystyle\sum_{i=1}^{i\leq n}(b[i]*L-a[i])*x[i]\leq 0,只要这个东西成立,那就能够说明有更优秀的答案了,甚至答案可能就是得到的组合x[i],但是并不确定。 所有我们只需要拥有一个能够在它提供的x[i]的选择要求下求出最优解的算法即可,不管用的是什么,图论,贪心,dp,数据结构,然后再这个验证的时间复杂度的基础上乘上一个O(log(sum(a[i])/min(a[i])))就可以了。

一般情况下这个二分的时间复杂度是O(log(1e9))的,化为常数不会超过40,即使大到了longlong的范围,也就是64。 是很可以接受的。里面验证的时间复杂度在n=1e5左右能够放宽到 两个log,也就是整体二分,cdq分治,树套树这些东西也是能够接受的。

很可以出题啊。

假如我现在要出一道cdq分治和分数规划的题目... emmmm 首先cdq分治的话只能做三维偏序了。。那就是,

给定三个数组,a[i],b[i],c[i],你需要选择[1,n]的一些数字(至少一个),组成一个数组d[m](1\leq m\leq n),设x[i]表示满足c[d[i]]<c[d[j]]b[d[i]]< b[d[j]]a[d[i]]<a[d[j]]的数字j的数量,y[i]表示满足c[d[i]]<c[d[j]]b[d[i]]< b[d[j]]a[d[i]]>a[d[j]]的数字j的数量,求{\displaystyle\sum_{i=1}^{i \leq m}x[i]\over \displaystyle\sum_{i=1}^{i \leq m}y[i]}的最大值,n\leq 100000<a[i],b[i],c[i]<1e9

额,假了。答案恒等一。难绷。

cdq分治和分数规划象性不好。难绷。

虽然强行结合的题目难度不会大,而且在我的认知里面这种题是要被打上烂题的标签的,但是还是有助于我理解的。

初级的结合应该是只能和能够提供选择的要求的题目类型结合,有意思一点的就是和dp了,感觉。

 



posted @ 2024-03-10 21:14  HL_ZZP  阅读(2)  评论(0编辑  收藏  举报