@TOC
小码哥的抽卡之旅1
时间限制:1秒
空间限制:128M
题目描述
小码哥最近迷上了一款抽卡游戏。单抽出金的概率是0.6%,如果前89发都不出金,则90发必出金。小天目前存了一些抽数,想要你帮他算算他出金的概率。
输入描述
一个整数n,表示小码哥的抽数
数据范围
1<=n<=90
输出描述
一个百分数p,表示出金的概率,保留六位小数(按所给样例)
样例一
输入
输出
题目分析
好像和原神的抽卡一模一样
抽$0$次中奖的概率是$0$,不中奖的概率是$1$
抽$1$次中奖的概率是$1\times 0.006 = 0.006$,不中的概率是$1 - 0.006 = 0.994$
$2$次抽奖机会能中奖的概率是$0.006 + 0.994\times 0.006 = 0.011964$
$\cdots$
注意,我描述$2$次抽奖的时候,说的不是抽2次中奖的概率
。
两次抽奖机会
不等于抽2次中奖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| ```抽2次中奖```是指前$1$次没中奖,第$2$次中奖了
# AC代码
其实做题的时候我忘特判$90$发必中了,$90$次机会能中奖的概率是$41.819882\%$,但是AC了。**AC代码不等于正确代码**
```cpp /* * @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; }
|
正确代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
#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$次都不中的概率是$(1-0.006)^n$,因此答案为$1 - (1 - 0.006) ^ n$
1 2 3
| 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