首页 > 试题广场 >

小天的 Minecraft

[编程题]小天的 Minecraft
  • 热度指数:976 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
在 `Minecraft is to Easy` 中前期只能通过沙砾获得铜粒,而沙砾掉落物掉落率如下:
- 铜粒:\frac{a}{16}
- 银粒:\frac{b}{16}
- 金粒:\frac{c}{16}
- 其它:\frac{16-a-b-c}{16}

4 个铜粒合成 1 个铜锭,1 个铜镐需要 3 个铜锭,并且铜镐只能在铜工作台或银工作台或金工作台上制作。铜、银、金工作台分别需要 1 个铜、银、金锭。银、金锭和铜锭一样分别需要 4 个银、金粒.

求破坏 16 个沙砾能做出铜镐的概率。

你的输出与标准输出误差在 10^{-8} 以内将被视为正确。

为了避免不必要的错误,请至少输出 10 位。

多组测试数据。

输入描述:
第一行一个正整数 t\ (1\leq t\leq 1000) 表示数据组数。

接下来 t 行,每行三个整数 a,b,c\ (0\leq a,b,c\leq 16,a+b+c\leq 16)


输出描述:
输出共 t 行。

对于每行,一个实数表示破坏 16 个沙砾能做出铜镐的概率。
示例1

输入

2
8 8 0
1 2 3

输出

0.0277862549
0.0000000000

备注:
#include <iostream>
#include <cstdio>
#include <cmath>

const long double N = 16.0L;
const int C16_4 = 16*15*14*13/(4*3*2*1);
int main()
{
    int t = 0;
    std::cin>>t;
    while(t--)
    {
        int a = 0,b = 0,c = 0;
        std::cin>>a>>b>>c;
        long double pa = (long double)a/N;
        long double pb = (long double)b/N;
        long double pc = (long double)c/N;
        long double ans = ::powl(pa,(long double)16) + ::powl(pa,(long double)12)*(::powl(pb,(long double)4) + powl(pc,(long double)4))*C16_4;
        printf("%.10Lf\n",ans);
    }
}

发表于 2025-11-29 08:46:35 回复(0)
铃仙不喜欢数学题,所以她使用dp了
设dp[c][i][j][k] 表示当前选取了c个物体,i个铜,j个铁,k个金
状态转移:
dp[c][i][j][k] = dp[c-1][i-1][j][k]*a/16+dp[c-1][i][j-1][k]*b/16+dp[c-1][i][j][k-1]*c/16
于是愉快ac了
发表于 2025-11-29 20:31:54 回复(0)