2014年山东省第五届ACM大学生程序设计竞赛-B-Circle

Circle

Time Limit: 2000ms   Memory limit: 65536K  

题目描述

You have been given a circle from 0 to n - 1. If you are currently at x, you will move to (x - 1) mod n or (x + 1) mod n with equal probability. Now we want to know the expected number of steps you need to reach x from 0.

输入

The first line contains one integer T — the number of test cases.
 
Each of the next T lines contains two integers n, x (0  ≤ x < n ≤ 1000) as we mention above.

输出

For each test case. Print a single float number — the expected number of steps you need to reach x from 0. The figure is accurate to 4 decimal places.

示例输入

3
3 2
5 4
10 5

示例输出

2.0000
4.0000
25.0000

提示

 

来源

2014年山东省第五届ACM大学生程序设计竞赛

思路

题意:有一个环,共有n个节点,从0标号到n-1,首尾相连,给定任意标号x,在非x点向左和向右走的概率相等,均为1/2,走到x点停止,那么从0点走到x点的数学期望是多少。
首先我们假设n=5,x=1,那么在非x点必然选择向右或者左走一步,对于在每一点的数学期望则有
E0=1+(E4+E1)/2;
E1=0;
E2=1+(E1+E3)/2;
E3=1+(E2+E4)/2;
E4=1+(E3+E0)/2;
等式两边分别想加得
E0+E1+E2+E3+E4= 1+(E4+E1)/2+0+1+(E1+E3)/2+1+(E2+E4)/2+1+(E3+E0)/2;
即E0+E2=2*(5-1);根据对称性显然E0=E2;故E0=E2=5-1=4;
我们可以推理到任意一种情况
均可得到等式
E(x+n-1)%n+E(x+1)%n= 2*(n-1);根据对称性均有E(x+n-1)%n=E(x+1)%n=n-1;
然后我们分别根据等式在已知E0,E1的数学期望下求E4,根据E0,E4求E3。。。


示例代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn(1e3+10);
long double probablity[maxn];//代表数学期望
int n,x;
void fun(int loc)//本函数还可以优化为到loc是0时停止
{
    if(probablity[(loc+1)%n]==-1)
    {
        probablity[(loc+1)%n]=2*probablity[loc]-2-probablity[(loc+n-1)%n];
        fun((loc+1)%n);
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&x);

        for(int i=0; i<n; i++)
            probablity[i]=-1;//初始化为-1,即还未进行计算

        probablity[x]=0;
        probablity[(x+1)%n]=n-1;
        probablity[(x+n-1)%n]=n-1;
        fun((x+1)%n);
        double ans=(double)probablity[0];
        printf("%.4f\n",ans);
    }
    return 0;
}




/**************************************
    Problem id  : SDUT OJ 2878
    User name   : crawl
    Result      : Accepted
    Take Memory : 560K
    Take Time   : 0MS
    Submit Time : 2016-05-20 18:16:24
**************************************/



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值