A - A Dangerous Maze
题意 : 有 n 个门,如果走正确的路花费 right[ i ] 分钟就可以走出去
如果走错误的路浪费 wrong i ] 分钟回到起点 (错误的给出负数)
每次不记得自己走过哪个
现在问 : 走出去的期望
分析: 考虑走出期望,分别是第一次走出去,第二次走出去,第三次走出去......
那么定义 Ei 为第 i 次走出去的期望,pi 到第 i 次的概率, ti 为走到第 i 次花费的时间
(p1 为成功走出去的概率 ,p2 为走失败的概率 ,t1 为走成功平均耗费时间 , t2 为走失败平均耗费时间 )
耗时 | 概率 | |
第 1 次走出去 | t1 | p1 |
第 2 次走出去 | t1 + t2 | p1 * p2 |
第 3 次走出去 | t1 + 2 * t2 | p1 * p2 ^ 2 |
第 n 次走出去 | t1 + (n - 1) * t2 | p1 * p2 ^ (n - 1) |
把答案拆成 t1 , t2 两部分算
第一部分 :
第二部分:
等比 + 等差,我敬爱的高中数学老师说过乘公比相减
利用洛必达,上下求导,可化成 0 约去
最后1 - p2 == p1 带进去
n 代表 rigth 的大小
贴代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 5;
#include<vector>
vector<int> z,f;
int main() {
int T,tcase = 0;
scanf("%d",&T);
while(T--) {
z.clear();
f.clear();
int tot,ch;
int suma = 0;
int sumb = 0;
scanf("%d",&tot);
for(int i=1;i<=tot;i++) {
scanf("%d",&ch);
if(ch > 0) {
z.push_back(ch);
suma += ch;
} else {
f.push_back(ch);
sumb -= ch;
}
}
int fz = suma + sumb;
int fm = z.size();
printf("Case %d: ",++tcase);
if(!fm) {
printf("inf\n");
} else {
int d = __gcd(fz,fm);
fz /= d;
fm /= d;
printf("%d/%d\n",fz,fm);
}
}
}