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. HDU 5677 ztr loves substring(Manacher+dp+二进制分解)

    题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...

  2. BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  3. Nginx 作为 WebSockets 代理

    WebSocket 协议给我们提供了一个创建可以支持客户端和服务端进行双向实时通信的web应用程序的方法.相比之前使用的方法,WebSocket(作为HTML5的一部分)可以使我们更容易开的发出这种类 ...

  4. 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

    Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...

  5. Python re模块正则表达式

  6. 【转】计算Java List中的重复项出现次数

    本文演示如何使用Collections.frequency和Map来计算重复项出现的次数.(Collections.frequency在JDK 1.5版本以后支持) package com.qiyad ...

  7. nodejs实战的github地址,喜欢的你还等啥

    第一章.第二章:使用Express + MongoDB搭建多人博客:https://github.com/nswbmw/N-blog 第三章:使用Redis搭建漂流瓶服务器:https://githu ...

  8. HDU 2086 P - A1 = ?(推表达式)

    传送门:http://acm.geekxiong.tech/vjudge/contest/view.action?cid=14#problem/P P - A1 = ? Time Limit:1000 ...

  9. WINDOWS 负载均衡NLB配置中单播与多播区别(转载)

    单播 在单播模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修 ...

  10. Jquery获取select标签的值、文本方式

    <script> function add(){            var prop_name=$("#prop").find("option:selec ...