n n n个人,每个人有属性 A i , B i A_i,B_i Ai,Bi
选出一些人给第 i i i个人投钱 x i x_i xi,使得 x i ∗ ( 1 + B i A i ) > ∑ x j x_i*(1+\frac{B_i}{A_i})>\sum x_j xi∗(1+AiBi)>∑xj
问你最多能选出多少人投钱(投多少无所谓,不关心)
设最后选了 k k k个人
化简一下 x i ∗ A i + B i A i > ∑ j = 1 k x j x_i*\frac{A_i+B_i}{A_i}>\sum\limits_{j=1}^k x_j xi∗AiAi+Bi>j=1∑kxj
也就是 x i ∑ j = 1 k x j > A i A i + B i \frac{x_i}{\sum\limits_{j=1}^k x_j}>\frac{A_i}{A_i+B_i} j=1∑kxjxi>Ai+BiAi
把 i i i取值为 [ 1 , k ] [1,k] [1,k]得到 k k k个不等式,相加得到
1 > ∑ A i A i + B i 1>\sum\frac{A_i}{A_i+B_i} 1>∑Ai+BiAi
所以我们贪心选 A i A i + B i \frac{A_i}{A_i+B_i} Ai+BiAi小的,不大于一就行
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1009;
int casenum;
long double p[maxn];
int main()
{
int t; cin >> t;
while( t-- )
{
int n; scanf("%d",&n);
long double x,y;
for(int i=1;i<=n;i++)
{
scanf("%Lf:%Lf",&x,&y);
p[i] = x/(x+y);
}
long double sum = 0;
sort( p+1,p+1+n );
int ans = 0;
for(int i=1;i<=n;i++)
{
sum += p[i];
if( sum>=1 ) break;
ans++;
}
printf("Case #%d: %d\n",++casenum,ans);
}
}