LINK

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=1k​xj

也就是 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=1k​xjxi​>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);
	}
}