gym101194 china final Problem E. Bet(数学,高精度)

来源:互联网 发布:闪电分期淘宝合作商户 编辑:程序博客网 时间:2024/05/16 09:53

题目链接

Problem E. Bet

 Input file:Output file: Time limit:
Standard InputStandard Ouptut1 second

The 2016 ACM-ICPC Asia China-Final Contest

page7image3424

The Codejamongame is on fire! Fans across the world are predicting and betting on which teamwill win the game.

A gambling company is providing betting odds for all teams; the odds for theithteam is Ai:Bi.

For each team, you can bet any positive amount of money, and you do not have to bet the same

amount on each team. If theithteam wins, you get your bet on that team back, plusBitimes

page7image7904

your bet on that team.

Ai

For example, suppose that there are two teams, with odds of 5:3 and 2:7 and you bet $20 on the

first team and $10 on the second team. If the first team wins, you will lose your $10 bet on the

second team, but you will receive your $20 bet back, plus3× 20 = 12, so you will have a total5

of $32 at the end. If the second team wins, you will lose your $20 bet on the first team, but youwill receive your $10 bet back, plus7× 10 = 35, so you will have a total of $45 at the end. Either

2

way, you will have more money than you bet ($20+$10=$30).

As a greedy fan, you want to bet on as many teams as possible to make sure that as long as oneof them wins, you will always end up withmore money than you bet. Can you figure out howmany teams you can bet on?

Input

The input starts with one line containing exactly one integerT , which is the number of test cases.

Each test case starts with one line containing an integerN: the number of teams in the game.Then,N more lines follow. Each line is a pair of numbers in the formAi:Bi(that is, a numberAi, followed by a colon, then a number Bi, with no spaces in between), indicating the odds forthe ithteam.

Output

For each test case, output one line containing “Case #x: y”, wherex is the test case number(starting from1) andy is the maximum number of teams that you can bet on, under the conditionsspecified in the problem statement.

Limits

1T100.
1N100.
0<Ai,Bi<100.
BothAiand Bihave at most3 digits after the decimal point.

page7image26168page7image26328page7image26488

Page 6 of 21

page8image440

The 2016 ACM-ICPC Asia China-Final Contest

page8image1256

Sample input and output

Note

In sample case #1, one optimal strategy is to bet 1.5 dollars on the first team and 1.5 dollars onthe third team. If the first team wins, you will get 1.5 + 1.5× (1.1/1) = 3.15 dollars back, and ifthe third team wins, you will get 1.5 + (1.7/1.5)× 1.5 = 3.2 dollars back. Both of these are higherthan the total money that you bet (1.5 + 1.5 = 3 dollars).

However, there is no way to bet on all three teams and be guaranteed a profit. 


参考题解


题意:

有一个赌博游戏,给出n个队的赔率A:B,问你最多能下注多少个队,才能使得不论你下注的这些队中哪一个队赢了你都可以赚,也就是最后所得金额大于下注的总额。

对于一个队,假设下注x,如果输了,那么你将失去x,如果赢了,你将额外得到(B/A)*x,也就是最后有x+(B/A)*x。


题解:

先用数学翻译一下此题,其实很简单就可以推出一个不等式:用Pi代表我下注的总额中第i个队占的金额占比,应有:

Pi(1+Bi/Ai)>1

即:

Pi > Ai/(Ai+Bi)

要使得尽可能下注多的队,就将所有队的Ai/(Ai+Bi)从小到大排序,挨着取,直到总和>=1


上面的博客说这一题需要高精度,然后手写了一个高精度除法,后来我在gym上点开一个AC代码发现用long double存也能过。


#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<queue>#include<stack>#include<cmath>using namespace std;#define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define pb push_back#define fi first#define se secondtypedef vector<int> VI;typedef long long ll;typedef pair<int,int> PII;const int maxn=100+10;long double p[maxn];int main(){    int cas;    scanf("%d",&cas);    for(int k=1;k<=cas;k++)    {        int n;        scanf("%d",&n);        double x,y;        rep(i,1,n+1)        {            scanf("%lf:%lf",&x,&y);            int x1=floor(x*1000),y1=floor(y*1000);            p[i]=1.0*x1/(x1+y1);        }        long double sum=0;        sort(p+1,p+n+1);        int cnt=0;        rep(i,1,n+1)        {            sum+=p[i];            if(sum>=1) break;            cnt++;        }        printf("Case #%d: %d\n",k,cnt);    }    return 0;}


0 0