HDU4405

Hzz非常喜欢飞机象棋。象棋地图包含N+1个从0到N的网格。Hzz从网格0开始。他每走一步就掷一个骰子(一个骰子有六个面,面朝上的概率相等,面上的数字是1、2、3、4、5、6)。当Hzz在第一格且骰子数为x时,他将移动到第一格+x。当i+x等于或大于N时,Hzz结束游戏。

 

国际象棋地图上还有M条航线。第i条飞行线可以帮助Hzz从网格Xi飞到Yi(0<Xi<Yi<=N),而无需掷骰子。如果有另一条来自易的航线,Hzz可以连续乘坐该航线。允许没有两条或两条以上的航线从同一网格开始。

 ______________________________________

f[i]:从i点走到重点要掷骨子几次

f[i]=(f[i+1]+f[i+2]+f[i+3]+f[i+4]+f[i+5]+f[i+6])/6+1

注意飞行线,如果u可以到v而v更大,那么f[u]=f[v]

______________________________________

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+20;
 4 int nxt[maxn];
 5 double f[maxn];
 6 int n,m;
 7 
 8 int main()
 9 {
10     while(scanf("%d%d",&n,&m)==2&&(n||m))
11     {
12         memset(nxt,-1,sizeof nxt);
13         memset(f,0,sizeof f);
14         for(int u,v,i=1;i<=m;++i)
15         {
16             scanf("%d%d",&u,&v);
17             nxt[u]=v;
18         }
19         for(int i=n-1;i>=0;i--)
20         {
21             if(nxt[i]!=-1)
22             {
23                 f[i]=f[nxt[i]];
24                 continue;
25             }
26             double tp=0;
27             for(int j=1;j<=6;++j)tp+=f[i+j];
28             f[i]=tp/6+1;
29         }
30         printf("%.4lf\n",f[0]);
31     }
32     return 0;
33 }
View Code

 

posted on 2021-02-21 14:23  gryzy  阅读(53)  评论(0编辑  收藏  举报

导航