完全图,\(1 \leq n \leq 1000\)每一天边有 \(p_{i,j}=\frac{A_{i,j}}{100}\) 的概率出现,可以站在原地不动,求 \(1\) 号点到 \(n\) 号点期望天数。


注意 Windows 下 double 读入异常地慢,而自己 Linux 下读入巨快……

首先,每个点肯定都会往期望更小的点走。如果目标点期望比自己大,还不如原地不动。

所以点构成了一个全序关系。显然对于每个点,它的决策是确定的。

所以当确定一个点的最小期望值时,需要确定一个排列 \(P\) 使得方程解出来的 \(E_1\) 最小,且 \(E_{P_i}\) 随着 \(i\) 增加单调不降:

\[E_{P_i} = \sum_{j \leq i} E_{P_j} \cdot p_{P_i,P_j} \cdot \prod_{k<j} \left( 1 - p_{P_i,P_k} \right)
\]

但是这样考虑太麻烦了,我们考虑倒着做:因为当 \(i\) 越小时, \(E_{P_i}\) 的式子越简单。

因此考虑从 \(n\) 号点往回递推,当我们确定 \(P_i\) 时,对于每个点,它的式子前几项都已经求出来了,对 \(j = i\) 移项,每次取能解出的最小的 \(E\)。即 dijkstra 地求。

需要类似前缀和优化的技巧。

考虑正确性:

不妨假设最终的 \(E_i\) 互不相同。

我们假设确定 \(P_i\) 时最小的那个叫 \(A\),然而我们顶替了一个 \(E\) 更大的 \(B\) 上去,那么 \(A\) 可以不走到 \(P_j (j \geq i)\) 的点达到更优解,那么就发生了 \(E_A < E_B\),全序关系被破坏,矛盾。

#include <bits/stdc++.h>

const int MAXN = 1010;
double P[MAXN][MAXN];
double E[MAXN], prod[MAXN], dis[MAXN];
bool vis[MAXN];
int n;
int main() {
std::ios_base::sync_with_stdio(false), std::cin.tie(0);
std::cin >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1, t; j <= n; ++j)
std::cin >> t, P[i][j] = t / 100.;
for (int i = 1; i < n; ++i)
dis[i] = 1e100, E[i] = prod[i] = 1;
dis[n] = 0;
for (int i = 1; i <= n; ++i) {
int at = 0;
for (int j = 1; j <= n; ++j)
if (!vis[j] && (!at || dis[at] > dis[j])) at = j;
vis[at] = true;
for (int j = 1; j <= n; ++j) if (!vis[j]) {
E[j] += dis[at] * prod[j] * P[j][at];
prod[j] *= 1 - P[j][at];
dis[j] = E[j] / (1 - prod[j]);
}
}
std::cout << std::fixed << std::setprecision(15) << dis[1] << std::endl;
return 0;
}

E. Intergalaxy Trips的更多相关文章

  1. CF#335 Intergalaxy Trips

     Intergalaxy Trips time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. 【CF605E】Intergalaxy Trips(贪心,动态规划)

    [CF605E]Intergalaxy Trips(贪心,动态规划) 题面 Codeforces 洛谷 有\(n\)个点,每个时刻第\(i\)个点和第\(j\)个点之间有\(p_{ij}\)的概率存在 ...

  3. CodeForces 605 E. Intergalaxy Trips

    E. Intergalaxy Trips time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  4. CF605E Intergalaxy Trips

    CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...

  5. [Codeforces]605E Intergalaxy Trips

    小C比较棘手的概率期望题,感觉以后这样的题还会贴几道出来. Description 给定一个n*n的邻接矩阵,邻接矩阵中元素pi,j表示的是从 i 到 j 这条单向道路在这一秒出现的概率百分比,走一条 ...

  6. CF605E Intergalaxy Trips 贪心 概率期望

    (当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...

  7. Intergalaxy Trips CodeForces - 605E (期望,dijkstra)

    大意: 给定矩阵$p$, $p_{i,j}$表示每一秒点$i$到点$j$有一条边的概率, 每秒钟可以走一条边, 或者停留在原地, 求最优决策下从$1$到$n$的期望用时. $f_x$为从$x$到$n$ ...

  8. [LeetCode] Trips and Users 旅行和用户

    The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are b ...

  9. 【Leetcode-Mysql】Trips and Users

    思路不总结了,看过题目自己尝试过之后,看下方代码应该能理解的 SELECT Request_at AS DAY, round( sum( CASE WHEN STATUS = 'completed' ...

随机推荐

  1. 【Python基础】10_Python中的字典

    1.字典的定义 和列表的区别 列表是 有序 对象的集合 字典是 无序 对象的集合 字典用 {} 定义 键 key 是索引 值 value 是数据 键 和 值 之间用 :分割 键 必须是唯一的 值 可以 ...

  2. python-day3(正式学习)

    执行python的两种方式 交互式 优点:运行一句执行一句,方便修改 缺点:关闭即消失,无法保存 命令行式 优点:能一直保存 缺点:代码全部写完才可以调试bug 以后尽量使用pycharm和jupyt ...

  3. html跑马灯/走马灯效果

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...

  4. SQLException: #22001你知道这个错误码吗

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! java.sql.SQLException: #22001 java.sql.SQLException: #22001 a ...

  5. 复杂度n求数组的第K大值

    利用快速排序的方法进行: #include<iostream> using namespace std; int test() { ; return a; } int quickSort( ...

  6. 关于Mybatis的几件小事(二)

    一.MyBatis缓存机制 1.简介 Mybatis包含了一个非常强大的查询缓存的特性,它可以非常方便地配置和定制. 缓存key极大提高查询效率 MyBatis系统中默认定义了两次缓存 默认情况下,只 ...

  7. LeetCode 腾讯精选50题--子集

    根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...

  8. JavaScript02

    一. 判断// 三元表达式// 循环// 判断: 用的最多的就是if判断// 1.// if(条件){// 当条件满足以后执行的语句// } // 2.// if(条件){// // }else{// ...

  9. c# 将datatable中的数据保存到excel文件中

    using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...

  10. mORMot学习笔记2-2种方式查询数据

    本例使用SqlServer 第一种方式结果放入Memo控件,,需要引用SynCommons, SynDB, SynOleDb; procedure TForm1.Button1Click(Sender ...