您的位置:首页 > 其它

[HDU 4418] Time travel

2016-05-23 12:17 393 查看
题目:给出一个长度为n的数轴和一个初始方向,一个人一次可以走[1,m]步,走到头就会自动反弹回来,求给定起点X到Y的期望步数

E[x]表示x点到终点的期望,则E[x]=sigma(E[x+i]+i),E[Y]=0

因为还有方向问题,所以我们把n个点拆成2*n-2个,原数轴01234变成01234321

即一个点表示沿固定方向到Y的期望

然后高斯消元解方程

n=1时需要特判

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-12//
#define maxn 205
int T,N,M,X,Y,D,F,A[maxn],vis[maxn],q[maxn];
double ans[maxn],fnc[maxn][maxn],p[maxn];
bool eq(double x,double y){ return fabs(x-y)<eps; }
bool judge(int s){
int head=0,tail=0;
F=0,memset(vis,-1,sizeof(vis));
vis[q[++tail]=s]=F++;
while(head<tail){
int u=q[++head];
for(int i=1;i<=M;i++){
if(eq(p[i],0))continue;
int v=(u+i)%(2*N-2);//go die
if(vis[v]==-1)vis[q[++tail]=v]=F++;
}
}
return vis[Y]!=-1||vis[2*N-2-Y]!=-1;
}
void build(){
memset(fnc,0,sizeof(fnc));
for(int i=0;i<2*N-2;i++){
if(vis[i]==-1)continue;
fnc[vis[i]][vis[i]]=1;
if(A[i]==Y)continue;
int u=vis[i];
for(int j=1;j<=M;j++){
int v=vis[(i+j)%(2*N-2)];
if(v==-1)continue;
fnc[u][v]-=p[j];
fnc[u][F]+=j*p[j];
}
}
}
bool guass(){
build();
int cur=0,nxt;
for(int i=0;i<F;i++){
for(nxt=cur;nxt<F;nxt++)
if(!eq(fnc[nxt][i],0))break;
if(nxt==F)continue;
if(nxt!=cur){
for(int j=0;j<=F;j++)
swap(fnc[cur][j],fnc[nxt][j]);
}
for(int j=cur+1;j<F;j++)
if(!eq(fnc[j][i],0)){
double val=fnc[j][i]/fnc[cur][i];
for(int k=i;k<=F;k++)
fnc[j][k]-=val*fnc[cur][k];
}
cur++;
}
for(int i=cur;i<F;i++)
if(!eq(fnc[i][F],0))return false;
for(int i=0;i<2*N-2;i++)ans[i]=-1;
for(int i=cur-1;i>=0;i--){
double res=fnc[i][F];
for(int j=F-1;j>=i;j--)
if(!eq(fnc[i][j],0)){//
if(eq(ans[j],-1))ans[j]=res/fnc[i][j];
res-=ans[j]*fnc[i][j];
}
}
return true;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d%d",&N,&M,&Y,&X,&D);
for(int i=1;i<=M;i++)
scanf("%lf",&p[i]),p[i]/=100;
if(N==1)printf("%.2lf\n",0.0);
else{
int s;
if(D==1)s=2*N-2-X;
else s=X;
for(int i=0;i<N;i++)A[i]=i;
for(int i=1;i<N-1;i++)A[2*N-2-i]=A[i];
if(!judge(s))puts("Impossible !");//
else if(!guass())puts("Impossible !");
else printf("%.2lf\n",ans[vis[s]]);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: