POJ 3111(二分,最大化平均值)

2021-08-15 09:03:59 字數 882 閱讀 9998

題意:

最大化平均值的模型:

n個物品的重量和價值分別為wi和

vi,從中選取

k個物品使得單位重量的價值最大。也就是使得

k個物品的σ

vi /σwi

最大。

使用二分搜尋解決這類問題:

σ

vi /

σwi >= x

也就是σ(vi-x*wi)>=0

去找最大的可行解

x即可!x越大,式子左邊越小,一直逼到=0的邊界!

本題屬於這個模型!只不過最後讓輸出的是選出來的是哪些物品,一樣的,

對vi-x*wi

排序的前

k個就是所求的物品。

題解:

最大化可行解。

#include#include#include#includeusing namespace std;

int m,k;

const int inf=1e7+1;

struct node

;struct node a[100000+5];

bool cmp(struct node n1,struct node n2)

bool c(double x)

int main()

{ cin>>m>>k;

for(int i=0; i

POJ3111 K Best 二分 最大化平均值)

tle了好幾次的原因,快排對於已經有一定順序的數排得比較快,所以要在上次排好的基礎上,繼續下一次排序。還有就是不用每一次都把新的選擇儲存下來,最後直接輸出b i num就可以,因為100次迴圈以後,最後幾次前k個b i num就是正解。一般而言,二分查詢的時候左開右閉或者左閉右開都是無所謂的,初始狀...

POJ 3111 K Best 最大化平均值

題目鏈結 click here 題目大意 有n個物品的重量和價值各自是wi和vi。從中選出k個物品使得單位重量的價值最大,輸出物品的編號 解題思路 最大化平均值的經典.參見click here include include include include include include using...

POJ 2976 3111(二分 最大化平均值)

poj 2976 題意給n組資料ai,bi,定義累計平均值為 現給出乙個整數k,要求從這n個數中去掉k個數後,最大累計平均值能有多大?四捨五入到整數 思路取n k個數,使得累計平均值最大。定義c x 表示能否取得n k個數,使得累計平均值 x。然後二分搜尋最大的x。可以這樣判斷可行性 只需要從大到小...