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

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了码蹄集 - MT2165 - 小码哥的抽卡之旅1相关的知识,希望对你有一定的参考价值。

小码哥的抽卡之旅1

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


题目描述

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


输入描述

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

数据范围

1<=n<=90


输出描述

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


样例一

输入

1

输出

0.600000%

题目分析

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

  • 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 <bits/stdc++.h>
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;

正确代码

/*
 * @Author: LetMeFly
 * @Date: 2022-08-04 09:43:00
 * @LastEditors: LetMeFly
 * @LastEditTime: 2022-08-04 09:43:02
 */
#include <bits/stdc++.h>
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;

方法二

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

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));

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

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

以上是关于码蹄集 - MT2165 - 小码哥的抽卡之旅1的主要内容,如果未能解决你的问题,请参考以下文章

码蹄集 - MT1274 · 买马

码蹄集 - MT3143 - 试管装液

码蹄集 - MT2201 · 各位之和

码蹄集 - MT2013 · 饿饿︕饭饭︕ - 解题思路版本

码蹄集 - MT3114 · 有趣的平衡 - 用样例通俗地讲解

码蹄集 - MT3203 - 填坑:骗数据过的~_~