[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时需要特判
View Code
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
相关文章推荐
- 浅谈设计模式之建造者模式
- 通过ODBC 创建Oracle 的DBlink
- Jackson - Quickstart
- UITableViewCell - accessoryType属性
- 第十三周阅读程序-交通工具类(1)
- JAVA面向对象变成学习!
- Java设计模式(二):单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率
- 解决linux kernerl3.13 安装vmware10 vnet错误
- Spark Checkpoint写操作代码分析
- IOS 正则表达式(NSPredicate的使用)
- 课程练习三-1015-problem O
- TensorFlow教程06:MNIST的CNN实现——源码和运行结果
- HDoj2114 大数
- js中使用el表达式,表达式值中带有换行解决方法
- java初始化实质剖析
- Spring 笔记
- CSS3变换
- 异步加载的JS如何在chrome浏览器断点调试?
- Android 拍照、选择图片并裁剪
- Lex Yacc (一) 入门