HDU 4418 Time travel
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的更多相关文章
- HDU 4418 Time travel 期望dp+dfs+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...
- [ACM] hdu 4418 Time travel (高斯消元求期望)
Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...
- hdu 4418 Time travel 概率DP
高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...
- 【HDU】4418 Time travel
http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:一个0-n-1的坐标轴,给出起点X.终点Y,和初始方向D(0表示从左向右.1表示从右向左,-1表示起 ...
- Time travel HDU - 4418(高斯消元)
Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to ...
- Time travel HDU - 4418 (概率DP)
对于每个点两个方向(两头只有一个方向)建一个点,然后预处理出每个点走k(1≤k≤n)k(1\le k\le n)k(1≤k≤n)到哪个点,列出方程式高斯消元就行了.记得前面bfsbfsbfs出那些点不 ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 【HDOJ】4418 Time travel
1. 题目描述K沿着$0,1,2,\cdots,n-1,n-2,n-3,\cdots,1,$的循环节不断地访问$[0, n-1]$个时光结点.某时刻,时光机故障,这导致K必须持续访问时间结点.故障发生 ...
- hdu 4418 高斯消元求期望
Time travel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- 正则工具类 -- RegexUtils
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util. ...
- 【[CQOI2014]数三角形】
lx让做的题,其实很简单,难度评到紫令人吃惊 首先读进来\(n,m\)先\(++\),之后就是一个格点数为\(n*m\)的矩阵了 我们直接求很那做,补集转化一下,我们容斥来做 首先所有的情况自然是\( ...
- 【[POI2015]WIL-Wilcze doły】
第一篇题解确实会被讨论区里的数据hack掉,那么就随便水一个不会被hack掉的题解吧 首先我们尝试着发现这道题的一些结论,你就会发现答案是单调的不降的 这里的答案不降指的是选择每一个位置\(i\)作为 ...
- Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
传送门:http://codeforces.com/contest/1087/problem/C C. Connect Three time limit per test 1 second memor ...
- SqlMapConfig.xml配置文件
SqlMapConfig.xml中配置的内容和顺序如下: 1.1 properties(属性) mybatis的属性加载顺序.读取顺序:properties------>resource或url ...
- 如何调试在OJ中的代码
在OJ上的原始程序: class Solution { public: ) return; ; ; while(*str != '\0'){ if(*str == ' '){ blank++; len ...
- HDU 1019 (多个数的最小公倍数)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1019 Least Common Multiple Time Limit: 2000/1000 MS (J ...
- C# 泛型的协变和逆变 (转载)
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...
- AtomicStampedReference解决ABA问题
在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 052-053
今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...