NYOJ 914 Yougth的最大化 二分

2021-08-04 07:30:09 字數 1129 閱讀 1112

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?

輸入

有多組測試資料

每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。

(1<=k=n<=10000) (1<=wi,vi<=1000000)

輸出輸出使得單位價值的最大值。(保留兩位小數)

樣例輸入

3 2

2 25 3

2 1

樣例輸出

0.75
二分搜尋

首先可能會想到直接以每個物品的單位重量的價值排序,但結果是錯的

對於樣例, 如果用剛才的想法做的話,會明顯會選擇(2,2)和(5,3),最後輸出(2+3)/(2+5) = 0.714

但是答案是選擇(2,2),(2,1);最後輸出(2+1)/(2+2) = 0.75

為什麼要這樣選呢?

我們可以假設我們拿到單位價值為x以上可以拿多少件物品,假設為m

那麼就有(wp[i1].v + ... + wp[im].v) / (wp[i1].w + ... + wp[im].w) >= x;

轉化成(wp[i1].v - x * wp[i1].w) + ... + (wp[im].v - x * wp[im].w) >= 0;

if(m>=k)說明如果是拿k件,還可以拿更大的單位價值,否則便只能拿比x小的

二分這個x

#include #include #define eps 1e-7

#define maxn 10005

using namespace std;

struct wp

wp[maxn];

double y[maxn]; //wp[i1].v - x * wp[i1].w,對這個進行排序

int cmp(double a, double b) //大到小

int main()

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

} return 0;

}

NYOJ 914 Yougth的最大化

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...

NYOJ 914 Yougth的最大化

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...

NYOJ 914 Yougth的最大化

題目資訊 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1...