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可行 變...