Time travel

http://acm.hdu.edu.cn/showproblem.php?pid=4418

分析:

  因为走到最后在折返,可以将区间复制一份,就变成了只往右走,012343210。

  写出转移方程:

$f[t] = 0$

$f[i] = p_1 \times (f[i +1] + 1) + p_2 \times (f[i +2] + 2) + \cdots$

$ =\sum\limits_{j=1}^{m}p_j \times (f[i + j] + j) $

$= \sum\limits_{j=1}^{m}p_j \times f[i + j] + \sum\limits_{j=1}^{m}p_j\times j$

然后列出线性方程组,用高斯消元求解。

$f[i] = \sum\limits_{j=1}^{m}p_j \times f[i + j] + \sum\limits_{j=1}^{m}p_j\times j$

$\sum\limits_{j=1}^{m}p_j\times j = f[i] - \sum\limits_{j=1}^{m}p_j \times f[i + j]$

补上其他项就是:

$sum =0 \times f[0] +0 \times f[1] + \cdots + f[i] + p_1 \times f[i+1] + p_2 \times f[i+2] + \cdots +0 \times f[n-1] + 0 \times f[n]$

首先bfs判一下能不能到达这个点。

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
}
const int N = ;
const double eps = 1e-;
double A[N][N], p[N], sum;
bool vis[N];
int n, m, s, t;
int q[N]; bool bfs() {
memset(vis, false, sizeof(vis));
int L = , R = ;
vis[s] = ;
q[++R] = s;
while (L <= R) {
int u = q[L ++];
for (int i=; i<=m; ++i) {
int v = (u + i) % n;
if (!vis[v] && fabs(p[i]) > eps) vis[v] = , q[++R] = v;
}
}
return vis[t] || vis[n - t]; // n-t折叠后的另一侧的点
}
void build() {
memset(A, , sizeof(A));
for (int i=; i<n; ++i) {
A[i][i] += ;
if (!vis[i]) { A[i][n] = 1e9; continue;}
if (i == t || i == n - t) { A[i][n] = ; continue; }
A[i][n] = sum;
for (int j=; j<=m; ++j)
A[i][(i + j) % n] -= p[j];
}
}
void Gauss() {
for (int k=; k<n; ++k) {
int r = k;
for (int i=k+; i<n; ++i)
if (fabs(A[i][k]) > fabs(A[r][k])) r = i;
if (k != r) for (int j=k; j<n; ++j) swap(A[k][j], A[r][j]);
for (int i=k+; i<n; ++i) {
if (fabs(A[i][k]) > eps) {
double t = A[i][k] / A[k][k];
for (int j=k+; j<=n; ++j) A[i][j] -= t * A[k][j]; //小于等于n
}
}
}
for (int i=n-; i>=; --i) {
for (int j=i+; j<=n; ++j)
A[i][n] -= A[j][n] * A[i][j];
A[i][n] /= A[i][i];
}
printf("%.2lf\n",A[s][n]);
}
int main() {
int T, d;
scanf("%d",&T);
while (T--) {
scanf("%d%d%d%d%d",&n, &m, &t, &s, &d);
n = (n - ) << ;
sum = ;
for (int i=; i<=m; ++i) {
scanf("%lf",&p[i]);
p[i] = p[i] / 100.0;
sum += p[i] * i;
}
if (s == t) { puts("0.00");continue; }
if (d) s = (n - s) % n;
if (!bfs()) { puts("Impossible !"); continue;}
build();
Gauss();
}
return ;
}

HDU 4418 Time travel的更多相关文章

  1. HDU 4418 Time travel 期望dp+dfs+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...

  2. [ACM] hdu 4418 Time travel (高斯消元求期望)

    Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...

  3. hdu 4418 Time travel 概率DP

    高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...

  4. 【HDU】4418 Time travel

    http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:一个0-n-1的坐标轴,给出起点X.终点Y,和初始方向D(0表示从左向右.1表示从右向左,-1表示起 ...

  5. Time travel HDU - 4418(高斯消元)

    Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to ...

  6. Time travel HDU - 4418 (概率DP)

    对于每个点两个方向(两头只有一个方向)建一个点,然后预处理出每个点走k(1≤k≤n)k(1\le k\le n)k(1≤k≤n)到哪个点,列出方程式高斯消元就行了.记得前面bfsbfsbfs出那些点不 ...

  7. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  8. 【HDOJ】4418 Time travel

    1. 题目描述K沿着$0,1,2,\cdots,n-1,n-2,n-3,\cdots,1,$的循环节不断地访问$[0, n-1]$个时光结点.某时刻,时光机故障,这导致K必须持续访问时间结点.故障发生 ...

  9. hdu 4418 高斯消元求期望

    Time travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. BZOJ3245:最快路线(最短路)

    Description 精明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知道能开多快.不过有一个合理的方 ...

  2. Loj#572. 「LibreOJ Round #11」Misaka Network 与求和

    题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...

  3. HDU 1698 【线段树,区间修改 + 维护区间和】

    题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...

  4. shiro权限配置的细节问题&认证

    细节: ---[urls]部分配置,其格式是    url=拦截器[参数] ,拦截器[参数] ---如果当前请求的 url 匹配 [urls] 部分或者某个url模式,将会执行配置的拦截器 ---an ...

  5. Pyplot教程(深度学习入门3)

    源地址:http://matplotlib.org/users/pyplot_tutorial.html .caret, .dropup > .btn > .caret { border- ...

  6. Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决

    Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...

  7. java 编写小工具 尝试 学习(四)

    1.在新建 的窗口上 ,添加了一个按钮后 ,给 按钮添加一个事件 ,意思就是  点击按钮后 发生什么事情!不废话 贴图 贴 代码! package jFrameDemo; import java.aw ...

  8. meta的随堂笔记

    Meta标签与搜索引擎优化(SEO) 概要 通常所说的meta标签,是在Html网页源代码中的一个重要的html标签.meta标签用来描述一个html网页文档的属性,例如作者.日期和时间.网页描述.关 ...

  9. .Net core 使用TimeJob

    在我以前的文章中有一个.Net core使用Quartz.Net ,一开始我们的设想就是定时操作数据库,所以有很多实现方法,后来发现TimeJob可以同样实现我们的需求,而且更简便. 所以我们就使用了 ...

  10. JSP + servlet 源码 实现文件的上传

    JSP页面 upLoad.jsp _________________________________ <%@ page language="java" import=&quo ...