World Cup
题目描述
世界杯来了!!!自然,足球博彩也变得炙手可热。现在有n家博彩公司针对比赛的胜负平给出不同的赔率(比如,赔率为1赔1.5,即如果下注1块钱,猜对了会获得1.5元,盈利0.5元),请问是否有一种策略可以保证一定赢钱?
输入
第一行是一个整数T(1≤T≤1000),表示样例的个数。 每个样例的第一行是一个整数n(1≤n≤10),表示博彩公司的数量。 以后的每行包括三个浮点数,w,d,l(1.0<w,d,l≤100.0),分别表示比赛主队胜平负的赔率。
输出
每行输出一个样例的结果,如果存在必赢的策略,输出"Yes";否则输出"No"。
样例输入
2 2 1.3 4.8 10.5 1.4 4.0 9.7 2 1.3 5.6 9.8 1.45 5.0 8.9样例输出
No Yes
解题思路:
一、我们先考虑如何一定能中奖:
比赛有 胜、平、负 三种情况,最后结果到底是胜或平还是负是不知道的,所以我们对三种结局都需要下注,即 胜、平、负 各下一注。这样才能保证一定能中奖。
二、然后考虑怎样才能保证一定能盈利:
-
不同公司的赔率是不一样的,赔率越高,奖金就越高。所以我们要选择赔率最高的下注,这样才可以让我们更轻松的盈利。那么我们就要找到胜、平、负各自最高的赔率,并记录下来(这里分别记为 Maxw、Maxd、Maxl )。
-
找到该去哪里下注了,但是每一注下多少钱呢?若 买胜下注x元,买平下注y元,买负下注z元。这个x y z 如何搭配才能保证盈利,这个我们怎么知道?总不能一个一个试出来吧,这个思路显然有点麻烦。
-
那不如换个角度思考
-
我们先认识一个等式: 本金 * 赔率 = 收入(本金 = 收入/赔率)(注意是收入,不是利润)
-
如果 收入 > 本金 是不是就是一定能够盈利。
-
在这个游戏中,如果我们预计收入 n 元,那么就要对三种结局情况分别下注 n/Maxw、n/Maxd、n/Maxl 元。
-
所以这里总的本金就是 n/Maxw + n/Maxd + n/Maxl 元。
-
最后判断若 n/Maxw + n/Maxd + n/Maxl < n ,那么就一定能盈利,反之不能。
-
AC代码如下:
#include <stdio.h>
int main()
{
int T,n;
double w,d,l,Maxw,Maxd,Maxl;
scanf("%d",&T);
while (T--)
{
Maxw = Maxd = Maxl = 0; // 三种比赛结果的最大赔率初始化为0
scanf("%d",&n);
for (int i = 0; i < n; i ++)
{
scanf("%lf %lf %lf",&w,&d,&l);
if (w > Maxw) // 保存最高赔率
Maxw = w;
if (d > Maxd)
Maxd = d;
if (l > Maxl)
Maxl = l;
}
if (1/Maxw + 1/Maxd + 1/Maxl < 1) // n 简化为 1 代替计算
printf("Yes\n");
else
printf("No\n");
}
return 0;
}