• HDU 4576 Robot(概率dp)


    Robot

    Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)
    Total Submission(s): 5906    Accepted Submission(s): 1754


    Problem Description

    Michael has a telecontrol robot. One day he put the robot on a loop with n cells. The cells are numbered from 1 to n clockwise.



    At first the robot is in cell 1. Then Michael uses a remote control to send m commands to the robot. A command will make the robot walk some distance. Unfortunately the direction part on the remote control is broken, so for every command the robot will chose a direction(clockwise or anticlockwise) randomly with equal possibility, and then walk w cells forward.
    Michael wants to know the possibility of the robot stopping in the cell that cell number >= l and <= r after m commands.
     

    Input

    There are multiple test cases. 
    Each test case contains several lines.
    The first line contains four integers: above mentioned n(1≤n≤200) ,m(0≤m≤1,000,000),l,r(1≤l≤r≤n).
    Then m lines follow, each representing a command. A command is a integer w(1≤w≤100) representing the cell length the robot will walk for this command.  
    The input end with n=0,m=0,l=0,r=0. You should not process this test case.
     

    Output

    For each test case in the input, you should output a line with the expected possibility. Output should be round to 4 digits after decimal points.
     
     

    Sample Input

    3 1 1 2 1 5 2 4 4 1 2 0 0 0 0
     

    Sample Output

    0.5000 0.2500

    分析

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 double f[2][210];
     8 // f[i][j]到第i次操作,位置j上的概率 
     9 
    10 int main() {
    11     
    12     int n,m,l,r;
    13     while (~scanf("%d%d%d%d",&n,&m,&l,&r) && n+m+l+r) {
    14         memset(f,0,sizeof(f));
    15         f[0][1] = 1.0;
    16         int cur = 0;        
    17         for (int w,i=1; i<=m; ++i) {
    18             scanf("%d",&w);
    19             w = w%n;
    20             cur = cur^1;
    21             for (int k=1; k<=n; ++k) {
    22                 f[cur][k] = f[cur^1][k+w>n?k+w-n:k+w]/2.0 + f[cur^1][k-w<1?k-w+n:k-w]/2.0;
    23             }
    24         }
    25         double ans = 0.0;
    26         for (int i=l; i<=r; ++i) ans += f[cur][i];
    27         printf("%.4lf
    ",ans);
    28     }
    29     return 0;    
    30 }
  • 相关阅读:
    适配器模式
    事务
    JUnit4
    命令模式
    组合模式
    MySQL语法
    MyEclipse工具
    数据源和连接池
    Annotation
    Java反射机制
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8582100.html
Copyright © 2020-2023  润新知