zoukankan      html  css  js  c++  java
  • 【数论】0 / 1 分数规划

    我们要解决的是 (dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}),其中 (x_i in {0, 1}),要求让上述式子最大值。

    我们考虑转换问题,若 (exists L),满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),那么 (sumlimits_{i=1}^n x_i imes a_i geq sumlimits_{i=1}^n x_i imes b_i imes L),此时,(dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}) 的最大值一定 (geq L),若 ( exists L),满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),那么 (sumlimits_{i=1}^n x_i imes a_i < sumlimits_{i=1}^n x_i imes b_i imes L),此时,(dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}) 的最大值一定 (< L),我们发现这个 (L) 是满足单调性的,于是我们可以二分这个 (L)

    现在问题就变为了如何判定是否存在 (x_i) 满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),这个很简单,当 (a_i - b_i imes L > 0) 时,我们便让 (x_i = 1),否则 (x_i = 0)

    于是这个问题就在 (O(n log max{L})) 解决了。

    若限制 (x_i)(1) 的个数为 (k) 个,我们只需在 check 时求出所有的 (a_i - b_i imes L),然后从大到小排序一遍,选取前 (k) 个,判断是否 (geq 0) 即可。

    code(有限制个数的)

  • 相关阅读:
    I-string_2019牛客暑期多校训练营(第四场)
    hackerrank Palindromic Border
    hackerrank Circular Palindromes
    uoj424
    bzoj5384
    uoj450
    QTP 表格的导入导出异常信息 笔记
    QTP基本循环异常遍历(代码方式实现)
    QTP基本循环正常遍历(代码方式实现)
    《大道至简》读后感
  • 原文地址:https://www.cnblogs.com/chzhc-/p/13695339.html
Copyright © 2011-2022 走看看