題解:一道經典的實數二分題。
二分答案,假設取這k個物品的下標為i1,
i2,.
....
,iki1
,i2
,..
...,
ik,二分得到乙個答案x。
a為重量,b為價值,實際的結果為:∑j=
1kbi
jaij
\sum_^k \frac}}
∑j=1k
aij
bij
。
如果∑ j=
1kbi
jaij
≥x
\sum_^k \frac}}≥x
∑j=1k
aij
bij
≥
x,那麼結果可能有點小,修改二分左邊界l=mid。
如果∑ j=
1kbi
jaij
<
x\sum_^k \frac}}∑j
=1k
aij
bij
<
x,那麼結果是大的,修改右邊界r=mid。
問題來了,如果選取這k個物品,其實可以將上式變形,以∑j=
1kbi
jaij
≥x
\sum_^k \frac}}≥x
∑j=1k
aij
bij
≥
x為例。
∑ j=
1kbi
jaij
≥x
\sum_^k \frac}}≥x
∑j=1k
aij
bij
≥
x ⇒ ∑j=
1k(b
ij−x
×aij
)≥
0\sum_^k -x\times})}≥0
∑j=1k
(bij
−x
×aij
)≥
0很明顯我們只需將(bi
j−x×
aij)
-x\times})}
(bij
−x×a
ij
)排序取前k個即可
如果∑ j=
1k(b
ij−x
×aij
)≥
0\sum_^k -x\times})}≥0
∑j=1k
(bij
−x
×aij
)≥
0,則代表∑j=
1kbi
jaij
≥x
\sum_^k \frac}}≥x
∑j=1k
aij
bij
≥
x,結果可能有點小,修改左邊界l=mid。
如果∑ j=
1k(b
ij−x
×aij
)<
0\sum_^k -x\times})}<0
∑j=1k
(bij
−x
×aij
)<
0,則代表∑j=
1kbi
jaij
<
x\sum_^k \frac}}∑j
=1k
aij
bij
<
x,結果結果是大的,那麼修改右邊界r=mid。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
//extern "c"
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef
long
double ld;
#define fi first
#define se second
#define pb push_back
#define pii pair
const
double pi=
acos(-
1.0)
;const
double eps=
1e-6
;const ll mod=
1e9+7;
const
int inf=
0x3f3f3f3f
;const
int maxn=
100005
;const
int maxm=
100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
struct node
node[maxn]
;double p[maxn]
;int n,k;
bool
check
(double x)
intmain()
printf
("%.2lf\n"
,l);
}}
wyh天鵝 牛客網
題目描述 你們wyh學長小時候住在河邊,因為周圍的生態環境非常好,所以經常會有天鵝浮在湖面上,每只天鵝都長得不一樣,它們偶爾排成一排,偶爾分散開,偶爾也會去其他河畔,wyh學長為了統計它們的個數,編了乙個程式賦予它們乙個 萌 值,但是這些天鵝很不聽話,一會兒會從別的地方游過來一兩隻,一會兒又會在統計...
牛客 拿物品 貪心
題目大意 給出 n 個物品,每個物品有兩個屬性代表價值,有兩個玩家依次輪流拿物品,玩家一拿到物品後的貢獻為屬性一的累加,同理玩家二拿到物品後的貢獻為屬性二的累加,現在問兩人都希望在拿完物品後的貢獻比對方盡可能多,問兩人會如何選擇 題目分析 現在看來是一道很簡單的貪心問題,但是在比賽的時候卻沒有反應過...
wyh的物品 (二分, 01分數規劃)
wyh學長現在手裡有n個物品,這n個物品的重量和價值都告訴你,然後現在讓你從中選取k個,問你在所有可能選取的方案中,最大的單位價值為多少 單位價值為選取的k個物品的總價值和總重量的比值 輸入第一行乙個整數t 1 t 10 接下來有t組測試資料,對於每組測試資料,第一行輸入兩個數n和k 1 k n 1...