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