HDU4418 Time travel(期望dp 高斯消元)
题意
Sol
mdzz这题真的太恶心了。。
首先不难看出这就是个高斯消元解方程的板子题
\(f[x] = \sum_{i = 1}^n f[to(x + i)] * p[i] + ave\)
\(ave\)表示每次走的期望路程
然后一件很恶心的事情是可以来回走,而且会出现\(M > N\)的情况(因为这个调了两个小时。。)
一种简单的解决方法是在原序列的后面接一段翻转后的序列
比如\(1 \ 2 \ 3 \ 4\)可以写成\(1 2 3 4 3 2\)
然后列式子解方程就行了
附送一个数据生成器
#include<bits/stdc++.h>
using namespace std;
int main() {
freopen("a.in", "w", stdout);
srand((unsigned)time(NULL));
int T = 30;
printf("%d\n", T);
while(T--) {
int N = rand() % 100 + 1, M = rand() % 20 + 1, Y = rand() % N, X = rand() % N, D = rand() % 2;
if(X == 0 || X == N - 1) D = -1;
printf("%d %d %d %d %d\n", N, M, Y, X, D);
int res = 100;
for(int i = 1; i <= M - 1; i++) {
int rd;
if(res == 0) rd = 0;
else rd = rand() % res + 1;
printf("%d ", rd); res -= rd;
}
printf("%d\n", res);
}
return 0;
}
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1001, mod = 998244353;
const double eps = 1e-9;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, X, Y, D, Lim, vis[MAXN];
double g[MAXN][MAXN], p[MAXN], ave;
int Gauss() {
for(int i = 1; i < Lim; i++) {
int mx = i;
for(int j = i + 1; j < Lim; j++)
if(fabs(g[j][i]) > fabs(g[mx][i])) mx = j;
swap(g[i], g[mx]);
//assert(g[i][i] > eps);
if(fabs(g[i][i]) < eps) return -1;
for(int j = i + 1; j < Lim; j++) {
double p = g[j][i] / g[i][i];
for(int k = i + 1; k <= Lim; k++)
g[j][k] -= g[i][k] * p;
}
}
for(int i = 1; i < Lim; i++) if(fabs(g[i][i]) < eps) return -1;
for(int i = Lim - 1; i >= 1; i--) {
g[i][i] = g[i][Lim] / g[i][i];
for(int j = i - 1; j >= 1; j--)
g[j][Lim] -= g[j][i] * g[i][i], g[j][i] = 0;
}
}
int walk(int a, int b) {
b %= (Lim - 1);
int x = a + b;
if(x <= Lim - 1) return x;
return x % (Lim - 1);
}
void init() {
memset(g, 0, sizeof(g));
memset(vis, 0, sizeof(vis));
ave = 0;
}
void BFS() {
queue<int> q; q.push(X); vis[X] = 1;
while(!q.empty()) {
int x = q.front(); q.pop();
for(int i = 1; i <= M; i++) {
if(p[i] > eps) {
int t = walk(x, i);
if(!vis[t]) q.push(t), vis[t] = 1;
}
}
}
}
void solve() {
init();
N = read(); M = read(); Y = read() + 1; X = read() + 1; D = read();
Lim = (N << 1) - 1;
for(int i = 1; i <= M; i++) p[i] = (double) read() / 100, ave += (double) i * p[i];
if(X == Y) {puts("0.00"); return;}
if(D > 0 || (D == -1 && X > Y)) X = N - X + 1, Y = N - Y + 1;
BFS();
for(int i = 1; i <= 2 * N - 2; i++) {
g[i][i] = 1;
if(!vis[i]) {g[i][Lim] = 3e18; continue;}
if(i == Y || (Lim - i + 1 == Y)) continue;
g[i][Lim] = ave;
for(int j = 1, t; j <= M; j++) {
t = walk(i, j);
g[i][t] -= p[j];
}
}
if((!vis[Y] && !vis[Lim - Y + 1]) || (Gauss() == -1)) puts("Impossible !");
else printf("%.2lf\n", g[X][X]);
}
int main() {
//freopen("a.in", "r", stdin);
//freopen("b.out", "w", stdout);
for(int T = read(); T; T--, solve());
return 0;
}
HDU4418 Time travel(期望dp 高斯消元)的更多相关文章
- HDU-4418 Time travel 概率DP,高斯消元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:简单来说就是给你1个环(n - 1 , n - 2 …… 0 ,1 , 2 , 3 …… ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- hdu4418 Time travel 【期望dp + 高斯消元】
题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...
- 期望dp+高斯消元+bfs——hdu4418
高斯消元又弄了半天.. 注意只要能建立矩阵,那就必定有解,所以高斯消元里可以直接return 1 #include<bits/stdc++.h> using namespace std; ...
- HDU 2262 Where is the canteen 期望dp+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...
- 【noi2019集训题1】 脑部进食 期望dp+高斯消元
题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
随机推荐
- 无法启动此程序,因为计算机中丢失QtCored4.dll。尝试重新安装该程序以解决此问题。
在创建一个win32控制台应用程序时包含了QtCore中的头文件,并且程序编译成功(至少说明属性配置是正确的),运行此程序会出现弹出如下的一个系统错误: 这样的情况该怎么解决?提示说计算机中丢失了Qt ...
- spring3.2+mybatis3.2+maven整合
用maven管理spring+mybatis的项目: 这里主要讲述的是maven中的pom.xml文件的配置,以及在maven构建过程中会碰到的几个问题(我用的是maven4.4的版本): 首先一步一 ...
- 电脑网络IP固定地址自动改变!
今天电脑的固定IP地址每次重启设备,会自动改变一次.所以每次重启电脑都要手动重设IP地址.网关.DNS及高级选项中的ip设置. 高级选项中的ip设置每次都有2个ip,都要我删除一个.我都崩溃了,还以为 ...
- LINUX中如何查看某个端口是否被占用
之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep ...
- WebDriverAPI(2)
操作浏览器窗口 被测网址http:http://www.baidu.com Java语言版本的API实例代码 String url = "http://www.baidu.com" ...
- web前端导出csv文件
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- js的基础知识笔记
目录 一.基本数据类型 二.函数 三.面向对象 一.基本数据类型 1.使用var声明变量.使用;结尾.使用{}表示代码块.使用驼峰式命名 2.变量是弱类型的,即并不严格要求声明变量的类型,一个变量可以 ...
- (01)JVM-内存三大核心区域以及分析
package org.burning.sport.jvm; /** * 从JVM调用的角度分析Java程序对内存空间的使用, * 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入 ...
- 解析ASP.NET Mvc开发之删除修改数据 分类: ASP.NET 2014-01-04 23:41 3203人阅读 评论(2) 收藏
目录: 从明源动力到创新工场这一路走来 解析ASP.NET WebForm和Mvc开发的区别 解析ASP.NET 和Mvc开发之查询数据实例 解析ASP.NET Mvc开发之EF延迟加载 ------ ...
- html的css选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...