首页 > 代码库 > LightOJ 1027 A Dangerous Maze(期望)
LightOJ 1027 A Dangerous Maze(期望)
https://cn.vjudge.net/problem/LightOJ-1027
题意:
有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新选择,每扇门被选中的概率是一样的,求期望。
思路:
做这种期望的问题必须得列一个方程来求解,不然无限写下去的话算不出。
设走出去的期望的E,对于第三个案例就是 E = 1/3 * 3 + 1/3( 6 + E) + 1/3 (9 + E),(选择第一扇门就直接出去,第二扇门先6分钟回去,然后再花期望E,第三扇门同理..)
因为这里每扇门的概率都是一样的,所以对于上式,我们是可以进行合并的,sum1表示正数门时间之和,sum2表示复数门时间之和,cnt1表示正数门数量,cnt2表示负数门数量。
于是,我们可以得到
E=1/n*sum1+1/n*(sum2+cnt2*E)
化简得:
E = (sum1 + sum2) / (n-cnt2)。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath>10 #include<map>11 #include<set>12 using namespace std;13 typedef long long ll;14 typedef pair<int,int> pll;15 const int INF = 0x3f3f3f3f;16 const int maxn = 100 + 5;17 18 int n;19 20 int door[maxn];21 22 int gcd(int a,int b)23 {24 return b==0?a:(gcd(b,a%b));25 }26 27 int main()28 {29 //freopen("in.txt","r",stdin);30 int T;31 int kase=0;32 scanf("%d",&T);33 while(T--)34 {35 printf("Case %d: ",++kase);36 scanf("%d",&n);37 for(int i=1;i<=n;i++) scanf("%d",&door[i]);38 39 int sum1=0,sum2=0;40 int cnt1=0,cnt2=0;41 for(int i=1;i<=n;i++)42 {43 if(door[i]>0) {cnt1++;sum1+=door[i];}44 else {cnt2++;sum2+=abs(door[i]);}45 }46 47 if(cnt1==0) {printf("inf\n");continue;}48 int g=gcd(sum1+sum2,n-cnt2);49 printf("%d/%d\n",(sum1+sum2)/g,(n-cnt2)/g);50 }51 return 0;52 }
LightOJ 1027 A Dangerous Maze(期望)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。