7.7.3 Coin Toss

题目描述

有一个流行的狂欢节游戏,一枚硬币被抛到一张桌子上,而在桌子上有一个被方砖以网格的形式所覆盖的网格区域。游戏奖品取决于硬币在静止的时候所盖到的方砖数量:盖到的方砖越多,奖品就越好。下图给出了五种抛硬币的情况:

,

在上述实例中,

  • 硬币1盖到1块方砖;
  • 硬币2盖到2块方砖;
  • 硬币3盖到3块方砖;
  • 硬币4盖到4块方砖;
  • 硬币5盖到2块方砖;

这里要说明的是,硬币落在网格区域的边界线上也是可以接受的(比如,硬币5的情况)。所谓一枚硬币盖到一块方砖,就是硬币要盖住了方砖的一部分面积;也就是说,硬币仅仅和方砖的边界线相切是不够的。硬币的圆心可以在网格区域中的任何一点,概率都是一样的。本题设定(1)硬币总是平放在的桌上;(2)玩家可以保证硬币的圆心总是在网格区域内,或在网格的边界线上。

一枚硬币盖到方砖数量的概率取决于方砖和硬币的大小,以及网格区域内方砖的行数和列数。在本题中,请您编写一个程序来计算一枚硬币盖到不同数量方砖的概率。

输入输出格式

输入格式

输入的第一行是一个整数,表示测试用例数。对于每个测试用例,在一行中给出4个用空格隔开的整数m, n, t和c;其中,网格区域由m行和n列方砖组成,方砖每条边的边长为t,硬币的直径为c。本题设定1≤m,n≤5000,1≤c<t≤1000。

输出格式 对于每个测试用例,在一行中输出测试用例的编号。然后给出1枚硬币盖到1块、2块、3块和4块方砖的概率。概率表示为四舍五入到小数点后4位的百分数。使用样例输出中给出的格式。请您使用双精度浮点数来执行计算。输出“负零(Negative zeros)”时,不输出负号。

在连续输出的测试用例之间,用空行分隔。

输入输出样例1

输入

 
  1. 3
  2. 5 5 10 3
  3. 7 4 25 20
  4. 10 10 10 4

输出

 
  1. Case 1:
  2. Probability of covering 1 tile = 57.7600%
  3. Probability of covering 2 tiles = 36.4800%
  4. Probability of covering 3 tiles = 1.2361%
  5. Probability of covering 4 tiles = 4.5239%
  6. Case 2:
  7. Probability of covering 1 tile = 12.5714%
  8. Probability of covering 2 tiles = 46.2857%
  9. Probability of covering 3 tiles = 8.8293%
  10. Probability of covering 4 tiles = 32.3135%
  11. Case 3:
  12. Probability of covering 1 tile = 40.9600%
  13. Probability of covering 2 tiles = 46.0800%
  14. Probability of covering 3 tiles = 2.7812%
  15. Probability of covering 4 tiles = 10.1788%
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI = acos(-1.0);
int main()
{
    double m, n, c, t; // m, n, t和c含义如题目描述
    int T;             // 测试用例数
    scanf("%d", &T);
    for (int cas = 1; cas <= T; cas++)
    { // 一次循环处理一个测试用例
        scanf("%lf%lf%lf%lf", &m, &n, &t, &c);
        double sum = n * m * t * t;                                                        // 网格的总面积
        double s2 = c * (t - c) * (2 * m * n - n - m) + c * (c / 2) * (2 * n + 2 * m - 4); // 盖到2块
        double s4 = PI * c * c / 4.0 * (m - 1) * (n - 1);                                  // 盖到4块
        double s3 = (m - 1) * (n - 1) * c * c - s4;                                        // 盖到3块
        double s1 = sum - s2 - s3 - s4;                                                    // 盖到1块
        // s1 = max(s1, 0.0); 考虑负零
        printf("Case %d:\n", cas);
        printf("Probability of covering 1 tile  = %.4f%\n", s1 / sum * 100);
        printf("Probability of covering 2 tiles = %.4f%\n", s2 / sum * 100);
        printf("Probability of covering 3 tiles = %.4f%\n", s3 / sum * 100);
        printf("Probability of covering 4 tiles = %.4f%\n", s4 / sum * 100);
        if (cas != T)
            puts("");
    }
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值