題目連接:php
http://codeforces.com/gym/101194/attachmentsc++
題意:code
現有 $N$ 支隊伍參加比賽,只有一個隊伍能獲勝。給出每一個隊伍一個賠率 $A_i:B_i$,你往這個隊投 $x$ 元,若該隊獲勝你可獲得 $\frac{A_i+B_i}{A_i}\cdot x$ 元,不然獲得 $0$ 元。blog
首先你要確保投注的每一個隊伍中,無論哪一個勝利了你均可以賺,如今要求最多能夠投多少個隊伍。ci
題解:get
假設你總共投注 $x(x>0)$ 元,且對於第 $i$ 個隊伍你投了 $p_i \cdot x(0 \le p_i \le 1)$ 元。那麼,必須知足 $p_i \cdot x \cdot \frac{A_i+B_i}{A_i}>x \Rightarrow p_i > \frac{A_i}{A_i+B_i}$it
顯然,$\sum p_i = 1$,必須知足 $\sum \frac{A_i}{A_i+B_i} < 1$,同時無論你選擇多少隊伍選擇哪幾個隊伍,io
又,只要知足 $\sum \frac{A_i}{A_i+B_i} < 1$ 我必然能夠調整每一個隊伍相應的 $p_i$ 使得 $p_i > \frac{A_i}{A_i+B_i}$。class
所以,只要儘量選擇 $\frac{A_i}{A_i+B_i}$ 小的隊伍,直到 $\sum \frac{A_i}{A_i+B_i} \ge 1$ 爲止。
double的精度不夠,須要用long double。
AC代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=105; int n; long double c[maxn]; int main() { int T; cin>>T; for(int kase=1;kase<=T;kase++) { scanf("%d",&n); for(int i=0;i<n;i++) { double a,b; scanf("%lf:%lf",&a,&b); a=floor(a*1000); b=floor(b*1000); c[i]=a/(a+b); } sort(c,c+n); int ans=0; long double sum=0; for(int i=0;i<n;i++) { sum+=c[i]; if(sum>=1) break; ans++; } printf("Case #%d: %d\n",kase,ans); } }