XTU-OJ 《C语言程序设计》 1405-世界杯

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

解题思路:

一、我们先考虑如何一定能中奖:

比赛有 胜、平、负 三种情况,最后结果到底是胜或平还是负是不知道的,所以我们对三种结局都需要下注,即 胜、平、负 各下一注。这样才能保证一定能中奖。

二、然后考虑怎样才能保证一定能盈利:

  1. 不同公司的赔率是不一样的,赔率越高,奖金就越高。所以我们要选择赔率最高的下注,这样才可以让我们更轻松的盈利。那么我们就要找到胜、平、负各自最高的赔率,并记录下来(这里分别记为 Maxw、Maxd、Maxl )。

  2. 找到该去哪里下注了,但是每一注下多少钱呢?若 买胜下注x元,买平下注y元,买负下注z元。这个x y z 如何搭配才能保证盈利,这个我们怎么知道?总不能一个一个试出来吧,这个思路显然有点麻烦。

  3. 那不如换个角度思考

    1. 我们先认识一个等式: 本金 * 赔率 = 收入(本金 = 收入/赔率)(注意是收入,不是利润

    2. 如果 收入 > 本金 是不是就是一定能够盈利。

    3. 在这个游戏中,如果我们预计收入 n 元,那么就要对三种结局情况分别下注 n/Maxw、n/Maxd、n/Maxl 元。

    4. 所以这里总的本金就是 n/Maxw + n/Maxd + n/Maxl 元。

    5. 最后判断若 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;
 }

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值