程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4576 : Robot

hdu 4576 : Robot

編輯:C++入門知識

Robot Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1600    Accepted Submission(s): 599     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     Source 2013ACM-ICPC杭州賽區全國邀請賽     算法:模擬 題目意思: Robot繞圓(1-n)行走,有m個命令,隨機選擇方向,第i個命令行走mi個距離。求在l到r的范圍內的概率. 思路: 模擬,不超時。 構造兩個數組,temp[]記錄前一個狀態,cnt[]記錄當前狀態(其初始化為0),將不為0的temp[],進行移動,然後加到目的位置的cnt[]中。最後輸出ans=temp[l]+...+temp[r];   代碼:

#include <stdio.h>
#include <string.h>
#define N 201
double cnt[N],temp[N];
int main()
{
    int n,m,l,r,i,j,sum1,w,sum2,pos;
    double ans;
    while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF && (n+m+l+r))
    {
        memset(cnt,0,sizeof(cnt));
        memset(temp,0,sizeof(temp));
        temp[1]=1;
        for(i=1;i<=m;++i)
        {
            scanf("%d",&w);//m個w
            for(j=1;j<=n;++j)
            {
                if(temp[j]==0)
                    continue;
                //順時針
                pos=j+w%n;//確定位置
                if(pos>n)
                {
                    pos-=n;
                }
                cnt[pos]+=0.5*temp[j];

                //逆時針
                pos=j-w%n;
                if(pos<=0)
                {
                    pos+=n;
                }
                cnt[pos]+=0.5*temp[j];
            }

            for(j=1;j<=n;++j)
            {
                temp[j]=cnt[j];
                cnt[j]=0;
            }
        }

        sum1=sum2=0;
        ans=0;
        for(i=l;i<=r;++i)
        {
            ans+=temp[i];
        }
        printf("%.4lf\n",ans);
    }
    return 0;
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved