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; }