A Dangerous Maze LightOJ - 1027

这题意真是...

题意:你在一个迷宫里,有一些门,每个门有一个参数x,如果为正表明你进入门后可以花x的时间出去,如果为负表明你进入门后可以花-x的时间回到出发的地方。每次回到出发的地方之后,不能记得之前的操作,因此每次你到这个地方,选择每个门的概率都是相等的。求出去的期望时间。

方法:

解一个期望方程即可。

走每个门概率都是1/n。设期望时间为t,对于某个门,设参数为x,如果x为正的,那么走这个门出去的期望时间是x,对总期望的贡献是1/n*x;如果x是负的,那么走这个门之后出去的期望时间就是在这个门里面浪费的时间(-x)再加上t,对总期望的贡献就是1/n*(t-x)。那么就可以列出方程,手算一下就行。

例如:
3个门,参数分别为3,-6,-9
1/3*3+1/3*(x+6)+1/3*(x+9)=x
1/3*3+1/3*x+1/3*6+1/3*x+1/3*9=x
(1-1/3*2)x=1/3*(3+6+9)
x=18

3个门,参数分别为3,-30,-60
3 -30 -60
1/3*3+1/3*(x+30)+1/3*(x+60)=x
x=91

2个门,参数分别为-30,-60
1/2*(x+30)+1/2*(x+60)=x
x=inf

那么,设a2为负值的数量,a1为所有参数绝对值之和
1/n*a1=(1-1/n*a2)x
a1/n=(1-a2/n)x
x=a1/n/(1-a2/n)=a1/(n*(1-a2/n))=a1/(n-a2)

解完方程之后就很简单了...用奇怪的方法算一下a1和a2就行...

错误记录(本地):题意杀,把题意当成了“如果是正的,在开始的x分钟不能出去,之后就能出去;如果是负的,则相反”

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,a1,a2,a3,T,TT;
 5 int main()
 6 {
 7     int i,t;
 8     scanf("%d",&T);
 9     for(TT=1;TT<=T;TT++)
10     {
11         scanf("%d",&n);
12         a1=a2=0;
13         for(i=1;i<=n;i++)
14         {
15             scanf("%d",&t);
16             if(t<0)
17                 a2++,a1-=t;
18             else
19                 a1+=t;
20         }
21         if(a2==n)
22         {
23             printf("Case %d: inf\n",TT);
24             continue;
25         }
26         a2=n-a2;
27         a3=__gcd(a1,a2);
28         printf("Case %d: %d/%d\n",TT,a1/a3,a2/a3);
29     }
30     return 0;
31 }
posted @ 2017-10-28 15:32  hehe_54321  阅读(209)  评论(0编辑  收藏  举报
AmazingCounters.com