wyh的物品 (二分, 01分數規劃)

2022-09-01 10:03:10 字數 1313 閱讀 9930

wyh學長現在手裡有n個物品,這n個物品的重量和價值都告訴你,然後現在讓你從中選取k個,問你在所有可能選取的方案中,最大的單位價值為多少(單位價值為選取的k個物品的總價值和總重量的比值)

輸入第一行乙個整數t(1<=t<=10)

接下來有t組測試資料,對於每組測試資料,第一行輸入兩個數n和k(1<=k<=n<=100000)

接下來有n行,每行兩個是a和b,代表這個物品的重量和價值

對於每組測試資料,輸出對應答案,結果保留兩位小數
示例1

1

3 22 2

5 32 1

0.75
對於樣例來說,我們選擇第乙個物品和第三個物品,達到最優目的

這一題乍看以為是乙個很水的貪心,然後仔細看了題目,不簡單。

我以為求出每乙個物品的價效比出來就行了,然後選k個相加求平均值。

但是不符合題目,按我那個思想則是0.71.而題目的最優解為0.75.

否定了我的思想後,我就想不出思路了。

於是菜雞只能去看題解了。

二分可以直接出答案。感覺二分還是強大啊。

二分條件需要公式推導,自己找出二分條件難啊!!!!

根據題目意思 ∑val[i] / ∑weight[i] >= x(x為所求的最大單位價值),

轉化 val[i]-weight[i]*x, 然後去二分這個x,按照val[i]-weight[i]*x從大到小排序,

迴圈k次選出物品,在統計各件物品的總價值和總重量的比值,

如果滿足》=x,則說明x為滿足的答案,l =mid繼續尋找最大值,如果不滿足》=x,即說明我們的x取大了,得取小一點,r=mid即可

最後上**

**

#include using namespace std;

#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)

typedef long long ll;

const int n = 1e5 + 10;

int n, k;

struct node

}a[n];

bool check(double x)

return sum2 / sum1 >= x;}

int main()

printf("%.2lf\n", l);

}return 0;

}

poj2976 二分 01分數規劃

題意 給出 n 1 1000 k 0 1000000000 代表有 n 個科目的成績,每個科目成績都有 a,b 兩種成績,後給出 n 個 a 和 n 個 b 的成績。現要使 y 達到最大,當去除 k 個科目的成績之後,y 最大能取到多大。思路 二分搜尋。y 所以100 sigema a y sige...

0 1分數規劃

題目鏈結 中文鏈結 附一篇大佬部落格感覺講的不錯 0 1分數規劃,不妨設 l a i b i 題目要求要讓結果最大,那麼就是l最大最終移相化簡可得 a i l b i 0,因為a 和b都是已知所以我們可以直接列舉l,當我們所求的值大於零說明l還有更優解當小於零時l沒有最優解。直接二分即可 inclu...

01分數規劃

01分數規劃,就是這樣乙個東西 max frac 其中 xi in 簡而言之,就是在n個物品中選出任意幾個 或者可以有限制選多少個 使得其兩種權值a,b的比值最大 這樣的問題可以二分解決 假如有這樣一道裸題 poj2976,選n k個物品使得比值最大 我們二分出r,若存在 frac r 則r可行 變...