• 码蹄集 - MT2165 - 小码哥的抽卡之旅1


    小码哥的抽卡之旅1

    时间限制:1秒
    空间限制:128M


    题目描述

    小码哥最近迷上了一款抽卡游戏。单抽出金的概率是0.6%,如果前89发都不出金,则90发必出金。小天目前存了一些抽数,想要你帮他算算他出金的概率。


    输入描述

    一个整数n,表示小码哥的抽数

    数据范围

    1<=n<=90


    输出描述

    一个百分数p,表示出金的概率,保留六位小数(按所给样例)


    样例一

    输入

    1
    
    • 1

    输出

    0.600000%
    
    • 1

    题目分析

    好像和原神的抽卡一模一样

    • 0 0 0次中奖的概率是 0 0 0,不中奖的概率是 1 1 1

    • 1 1 1次中奖的概率是 1 × 0.006 = 0.006 1\times 0.006 = 0.006 1×0.006=0.006,不中的概率是 1 − 0.006 = 0.994 1 - 0.006 = 0.994 10.006=0.994

    • 2 2 2次抽奖机会能中奖的概率是 0.006 + 0.994 × 0.006 = 0.011964 0.006 + 0.994\times 0.006 = 0.011964 0.006+0.994×0.006=0.011964

    • ⋯ \cdots

    注意,我描述 2 2 2次抽奖的时候,说的不是抽2次中奖的概率

    两次抽奖机会不等于抽2次中奖

    两次抽奖机会是指最多抽两次,哪一次中奖都可以

    抽2次中奖是指前 1 1 1次没中奖,第 2 2 2次中奖了

    AC代码

    其实做题的时候我忘特判 90 90 90发必中了, 90 90 90次机会能中奖的概率是 41.819882 % 41.819882\% 41.819882%,但是AC了。AC代码不等于正确代码

    /*
     * @Author: LetMeFly
     * @Date: 2022-08-03 18:30:18
     * @LastEditors: LetMeFly
     * @LastEditTime: 2022-08-03 18:33:03
     */
    #include 
    using namespace std;
    #define mem(a) memset(a, 0, sizeof(a))
    #define dbg(x) cout << #x << " = " << x << endl
    #define fi(i, l, r) for (int i = l; i < r; i++)
    #define cd(a) scanf("%d", &a)
    typedef long long ll;
    int main() {
        int n;
        double get = 0, notget = 1 - get;
        cin >> n;
        for (int i = 0; i < n; i++) {
            get += notget * 0.006;
            notget = 1 - get;
        }
        printf("%.6lf%\n", get * 100);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    正确代码

    /*
     * @Author: LetMeFly
     * @Date: 2022-08-04 09:43:00
     * @LastEditors: LetMeFly
     * @LastEditTime: 2022-08-04 09:43:02
     */
    #include 
    using namespace std;
    #define mem(a) memset(a, 0, sizeof(a))
    #define dbg(x) cout << #x << " = " << x << endl
    #define fi(i, l, r) for (int i = l; i < r; i++)
    #define cd(a) scanf("%d", &a)
    typedef long long ll;
    int main() {
        int n;
        double get = 0, notget = 1 - get;
        cin >> n;
        for (int i = 0; i < n; i++) {
            get += notget * 0.006;
            notget = 1 - get;
        }
        printf("%.6lf%\n", n == 90 ? double(1) : get * 100);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方法二

    其实也可以不用这么麻烦,直接枚举每一次不中奖的概率,代码更简短

    n n n次都不中的概率是 ( 1 − 0.006 ) n (1-0.006)^n (10.006)n,因此答案为 1 − ( 1 − 0.006 ) n 1 - (1 - 0.006) ^ n 1(10.006)n

    int n;
    cin >> n;
    printf("%.6lf%\n", n == 90 ? double(1) : 1 - pow(1 - 0.006, n));
    
    • 1
    • 2
    • 3

    虽然代码可以复制,但最好还是自己理解后再敲哦

    原创不易,转载请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/126153308

  • 相关阅读:
    基于PChmi.dll的上位机与PLC1200通讯
    10.01
    Monaco Editor教程(五): 实现同时多文件编辑,tab切换
    react hooks 封装svg 双色(可拓展多色)图标组件
    DCahce-CacheServer分析(九)
    webgl未使用独立显卡报告
    Undefined reference to pthread_create in Linux
    docker总结
    [自然语言处理] 自然语言处理库spaCy使用指北
    Java线程池ThreadPoolExecutor详解(一篇就够了)
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/126153308