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 ...
随机推荐
- django+ajax用FileResponse文件下载到浏览器过程中遇到的问题
问题: 公司的需求是从mongodb中查找数据并下载回本地,但是在将文件从mongodb通过django服务端,然后从django服务端向浏览器下载文件.但是在下载的时候出了些问题.由于是用的ajax ...
- BZOJ2820:YY的GCD(莫比乌斯反演)
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...
- BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)
Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本 身,及他上下左右的4个元素(如果存在). 给定矩阵的行数和列数,请计算并输 ...
- 【[USACO13NOV]没有找零No Change】
其实我是点单调队列的标签进来的,之后看着题就懵逼了 于是就去题解里一翻,发现楼上楼下的题解说的都好有道理, f[j]表示一个再使用一个硬币就能到达i的某个之前状态,b[now]表示使用那个能使状态j变 ...
- js获取浏览器上一访问页面URL地址,document.referrer方法
如题,可用document.referrer方法获取上一页面的url 但是也有不可使用的情况 直接在浏览器地址栏中输入地址: 使用location.reload()刷新(location.href或者 ...
- sql中UNION和UNION ALL的区别
写sql时我们经常会遇到需要把从多张表查询的集果集进行合并.这时就用到了union.使用union或union all 时一定要保证查询的列的一致性 .不然sql会报错.字段不一致的话可以用单引号来占 ...
- 自动曝光修复算法 附完整C代码
众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...
- js扩展String.prototype.format字符串拼接的功能
1.题外话,有关概念理解:String.prototype 属性表示 String原型对象.所有 String 的实例都继承自 String.prototype. 任何String.prototype ...
- python中mysql主从同步配置的方法
1)安装mysql ubuntu中安装一台mysql了,docker安装另外一台mysql 获取mysql的镜像,主从同步尽量保证多台mysql的版本相同,我的ubuntu中存在的mysql是5.7. ...
- 帝国cms伪静态设置方法(收藏)
众所周知,动态页面不利于收录和排名.伪静态可以完美的解决这问题,配合百度云加速CDN,可以让动态页面有静态页面一样快的访问速度. 今天开拓族给大家带来帝国CMS伪静态的详细设置方法. 1.栏目设置为动 ...