E. Intergalaxy Trips
完全图,\(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\) 增加单调不降:
\]
但是这样考虑太麻烦了,我们考虑倒着做:因为当 \(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的更多相关文章
- CF#335 Intergalaxy Trips
Intergalaxy Trips time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 【CF605E】Intergalaxy Trips(贪心,动态规划)
[CF605E]Intergalaxy Trips(贪心,动态规划) 题面 Codeforces 洛谷 有\(n\)个点,每个时刻第\(i\)个点和第\(j\)个点之间有\(p_{ij}\)的概率存在 ...
- CodeForces 605 E. Intergalaxy Trips
E. Intergalaxy Trips time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...
- CF605E Intergalaxy Trips
CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...
- [Codeforces]605E Intergalaxy Trips
小C比较棘手的概率期望题,感觉以后这样的题还会贴几道出来. Description 给定一个n*n的邻接矩阵,邻接矩阵中元素pi,j表示的是从 i 到 j 这条单向道路在这一秒出现的概率百分比,走一条 ...
- CF605E Intergalaxy Trips 贪心 概率期望
(当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...
- Intergalaxy Trips CodeForces - 605E (期望,dijkstra)
大意: 给定矩阵$p$, $p_{i,j}$表示每一秒点$i$到点$j$有一条边的概率, 每秒钟可以走一条边, 或者停留在原地, 求最优决策下从$1$到$n$的期望用时. $f_x$为从$x$到$n$ ...
- [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 ...
- 【Leetcode-Mysql】Trips and Users
思路不总结了,看过题目自己尝试过之后,看下方代码应该能理解的 SELECT Request_at AS DAY, round( sum( CASE WHEN STATUS = 'completed' ...
随机推荐
- 【Python基础】10_Python中的字典
1.字典的定义 和列表的区别 列表是 有序 对象的集合 字典是 无序 对象的集合 字典用 {} 定义 键 key 是索引 值 value 是数据 键 和 值 之间用 :分割 键 必须是唯一的 值 可以 ...
- python-day3(正式学习)
执行python的两种方式 交互式 优点:运行一句执行一句,方便修改 缺点:关闭即消失,无法保存 命令行式 优点:能一直保存 缺点:代码全部写完才可以调试bug 以后尽量使用pycharm和jupyt ...
- html跑马灯/走马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...
- SQLException: #22001你知道这个错误码吗
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! java.sql.SQLException: #22001 java.sql.SQLException: #22001 a ...
- 复杂度n求数组的第K大值
利用快速排序的方法进行: #include<iostream> using namespace std; int test() { ; return a; } int quickSort( ...
- 关于Mybatis的几件小事(二)
一.MyBatis缓存机制 1.简介 Mybatis包含了一个非常强大的查询缓存的特性,它可以非常方便地配置和定制. 缓存key极大提高查询效率 MyBatis系统中默认定义了两次缓存 默认情况下,只 ...
- LeetCode 腾讯精选50题--子集
根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...
- JavaScript02
一. 判断// 三元表达式// 循环// 判断: 用的最多的就是if判断// 1.// if(条件){// 当条件满足以后执行的语句// } // 2.// if(条件){// // }else{// ...
- c# 将datatable中的数据保存到excel文件中
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...
- mORMot学习笔记2-2种方式查询数据
本例使用SqlServer 第一种方式结果放入Memo控件,,需要引用SynCommons, SynDB, SynOleDb; procedure TForm1.Button1Click(Sender ...