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. Django objects.values

    values(*fields) 返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象. 每个字典表示一个对象,键对应于模型对象的属性名称. 下面的 ...

  2. anydesk重启脚本

    1.restart.sh: #!/bin/sh sh /home/zhoushuo/anydeskTest/stop.sh echo 'zhoushuo'|sudo -S /usr/bin/anyde ...

  3. cannot be resolved解决方法

    引言: eclipse新导入的项目经常可以看到“XX cannot be resolved to a type”的报错信息.本文将做以简单总结. 正文: (1)jdk不匹配(或不存在) 项目指定的jd ...

  4. Perl中的字符串操作函数

    1.$position = index(string,substring,skipchars): 该函数返回子串substring在字符串string中的位置,如果不存在,则返回-1:参数skipch ...

  5. Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) 【思维】

    传送门:http://codeforces.com/contest/1092/problem/D1 D1. Great Vova Wall (Version 1) time limit per tes ...

  6. 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取

    thymeleaf公共页面元素抽取 存在一种现象:两个文件的代码只有一部分代码不一样 其余的均相同,此时就可以提取公共的代码去简化开发 .抽取公共片段 <div th:fragment=&quo ...

  7. Crontab 学习

    分钟 小时 日期 月份 星期几 整点执行 0 8-22 * * * /usr/bin/php /home/anbaojia/wwwroot/shjn/yii report/sync 查看 cron 执 ...

  8. NopCommerce 3.4中移动端访问抛弃响应式布局

    在Nop3.4中,他抛弃了原来的xxx.Mobile.cshtml的这种写法,而是采用了响应式布局,并且把规则也给改了,你在后台配置不启用响应式布局,在前台你仍然不能写xxx.Mobile.cshtm ...

  9. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  10. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49

    今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...