题目描述

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。

在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上。在第 ii(1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c_ici​ 上课,而另一节课程在教室 d_idi​ 进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程。如果学生想更换第 ii 节课程的教室,则需要提出申请。若申请通过,学生就可以在第 ii 个时间段去教室 d_idi​ 上课,否则仍然在教室 c_ici​ 上课。

由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 ii 节课程的教室时,申请被通过的概率是一个已知的实数 k_iki​,并且对于不同课程的申请,被通过的概率是互相独立的。

学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多 mm 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 mm 门课程,也可以不用完这 mm 个申请的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。

牛牛所在的大学有 vv 个教室,有 ee 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 ii(1 \leq i \leq n-11≤i≤n−1)节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

输入输出格式

输入格式:

第一行四个整数 n,m,v,en,m,v,e。nn 表示这个学期内的时间段的数量;mm 表示牛牛最多可以申请更换多少节课程的教室;vv 表示牛牛学校里教室的数量;ee表示牛牛的学校里道路的数量。

第二行 nn 个正整数,第 ii(1 \leq i \leq n1≤i≤n)个正整数表示 c_ici​,即第 ii 个时间段牛牛被安排上课的教室;保证 1 \le c_i \le v1≤ci​≤v。

第三行 nn 个正整数,第 ii(1 \leq i \leq n1≤i≤n)个正整数表示 d_idi​,即第 ii 个时间段另一间上同样课程的教室;保证 1 \le d_i \le v1≤di​≤v。

第四行 nn 个实数,第 ii(1 \leq i \leq n1≤i≤n)个实数表示 k_iki​,即牛牛申请在第 ii 个时间段更换教室获得通过的概率。保证 0 \le k_i \le 10≤ki​≤1。

接下来 ee 行,每行三个正整数 a_j, b_j, w_jaj​,bj​,wj​,表示有一条双向道路连接教室 a_j, b_jaj​,bj​,通过这条道路需要耗费的体力值是 w_jwj​;保证 1 \le a_j, b_j \le v1≤aj​,bj​≤v, 1 \le w_j \le 1001≤wj​≤100。

保证 1 \leq n \leq 20001≤n≤2000,0 \leq m \leq 20000≤m≤2000,1 \leq v \leq 3001≤v≤300,0 \leq e \leq 900000≤e≤90000。

保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。

保证输入的实数最多包含 33 位小数。

输出格式:

输出一行,包含一个实数,四舍五入精确到小数点后恰好22位,表示答案。你的输出必须和标准输出完全一样才算正确。

测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 4 \times 10^{-3}4×10−3。 (如果你不知道什么是浮点误差,这段话可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理)

输入输出样例

输入样例#1: 复制

3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5
1 2 5
1 3 3
2 3 1
输出样例#1: 复制

2.80

说明

【样例1说明】

所有可行的申请方案和期望收益如下表:

【提示】

  1. 道路中可能会有多条双向道路连接相同的两间教室。 也有可能有道路两端连接

的是同一间教室。

2.请注意区分n,m,v,e的意义, n不是教室的数量, m不是道路的数量。

特殊性质1:图上任意两点 a_iai​, b_ibi​, a_iai​≠ b_ibi​间,存在一条耗费体力最少的路径只包含一条道路。

特殊性质2:对于所有的 $1≤ i≤ n$, k_i= 1ki​=1 。


  题目大意 (题目太"简洁",不需要大意)

  显然动态规划。

  很轻松就能想出 f[i][j][ / ] 表示上到第i节课,已经申请了j次,第i节课有没有申请(这个会影响结果)

  然后考虑转移。

  对于状态 f[i][j][] ,它可以通过上次申请了或者没有申请转移过来,即 f[i][j][] = min(f[i - ][j][] + dcc, f[i - ][j][] + dcc * ( - ip) + ddc * ip)

  对于状态 f[i][j][] ,同理,然后加上对应距离乘对应概率就好了。(真的觉得没什么好说的。。)

  记得去年考NOIP的时候做这道题,都不知道什么是期望,一脸懵逼。

  其实这道题并不难。然而我把Floyd的for k写到了最里面,于是我就笑笑(1个小时就这么飞走了,我是不是学了假的Floyd?)。。

Code

 /**
* luogu
* Problem#1850
* Accepted
* Time: 2724ms
* Memory: 63597k
*/
#include <bits/stdc++.h>
using namespace std;
#define smin(_a, _b) _a = min(_a, _b)
#define smax(_a, _b) _a = max(_a, _b) const int V = ;
const int N = , M = ; int n, m, v, e;
int dis[V][V];
double f[N][M][];
int *c, *d;
double *p; inline void init() {
scanf("%d%d%d%d", &n, &m, &v, &e);
c = new int[(n + )];
d = new int[(n + )];
p = new double[(n + )];
for(int i = ; i <= n; i++)
scanf("%d", c + i);
for(int i = ; i <= n; i++)
scanf("%d", d + i);
for(int i = ; i <= n; i++)
scanf("%lf", p + i);
for(int i = ; i <= v; i++)
for(int j = ; j <= v; j++)
dis[i][j] = << ;
for(int i = , u, v, w; i <= e; i++) {
scanf("%d%d%d", &u, &v, &w);
smin(dis[u][v], w);
dis[v][u] = dis[u][v];
}
} inline void floyed() {
for(int i = ; i <= v; i++)
dis[i][i] = ;
for(int k = ; k <= v; k++)
for(int i = ; i <= v; i++)
for(int j = ; j <= v; j++)
smin(dis[i][j], dis[i][k] + dis[k][j]);
} inline void solve() {
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
f[i][j][] = f[i][j][] = 1e100;
f[][][] = f[][][] = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= m && j <= i; j++) {
int &dcc = dis[c[i - ]][c[i]], &dcd = dis[c[i - ]][d[i]];
int &ddc = dis[d[i - ]][c[i]], &ddd = dis[d[i - ]][d[i]];
double &ip = p[i - ], &np = p[i];
if(j <= i - )
f[i][j][] = min(f[i - ][j][] + dcc, f[i - ][j][] + dcc * ( - ip) + ddc * ip);
if(j) {
smin(f[i][j][], f[i - ][j - ][] + dcc * ( - np) + dcd * np);
smin(f[i][j][], f[i - ][j - ][] + ( - ip) * (dcc * ( - np) + dcd * np) + ip * (ddc * ( - np) + ddd * np));
}
}
double ans = 1e100;
for(int i = ; i <= m && i <= n; i++)
for(int k = ; k < ; k++)
smin(ans, f[n][i][k]);
printf("%.2lf", ans);
} int main() {
init();
floyed();
solve();
return ;
}

NOIP 2016 换教室 (luogu 1850 & uoj 262) - 概率与期望 - 动态规划的更多相关文章

  1. [BZOJ 4720][NOIP 2016] 换教室

    记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec  M ...

  2. [NOIp 2016]换教室

    Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $2n$ 节课程安排在 $n$ 个时间段上.在第 $i$($1 \leq ...

  3. NOIP 2016 换教室(期望dp)

    第一次做期望dp 并不知道每个阶段的期望之和就是整个的期望之和 所以一直卡在这 期望=代价*概率 然后注意只有申请了才算期望,否则按原来的. 这道题和前几个课程,申请的限制,当前选或不选,有关 这样很 ...

  4. 【NOIP】2016 换教室

    [算法]期望DP+floyd [题解]用floyd预处理最短距离. 注意重边与自环——图论双毒!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QAQ 然后搞清楚方案和概率的问 ...

  5. [Luogu 1850] noip16 换教室

    [Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...

  6. 「 Luogu P1850 」 换教室

    解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ ...

  7. [NOIP2016][luogu]换教室[DP]

    [NOIP2016] Day1 T3 换教室 ——!x^n+y^n=z^n 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程 ...

  8. Luogu P1850 换教室(期望dp)

    P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\l ...

  9. Luogu P1850 [NOIp2016提高组]换教室 | 期望dp

    题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...

随机推荐

  1. 转git的使用

    git的使用(包括创建远程仓库到上传代码到git的详细步骤以及git的一些常用命令) A创建远程仓库到上传代码到git 1)登陆或这注册git账号 https://github.com 2)创建远程仓 ...

  2. spring之拦截器

    拦截器 实现HandlerInterceptor接口:注册拦截器<mvc:inteceptors> spring和springMVC父子容器的关系 在spring整体框架的核心概念中,容器 ...

  3. InstallShield2015制作安装包----------卸载后删除安装目录和文件

    卸载程序后,一般是需要将安装目录清除干净.但是,如果程序运行中有文件生成,这时InstallShield自带的卸载程序,不会卸载这些运行时生成的文件. 卸载不干净,可能会对下次程序的安装,和安装后的运 ...

  4. Unity shader学习之渐变纹理

    渐变纹理,及使用纹理来存储漫反射光照的结果,这种技术在游戏<军团要塞2>中流行起来,它也是由Valve公司(提出半兰伯特光照技术的公司)提出来的,他们使用这种技术来渲染游戏中具有插画风格的 ...

  5. python base64加密文本内容(1)

    仅仅使用base64加密安全系数太低了,我们还可以自定义base64加密后的文本进行一些变化,提高安全系数,在解密时再回复某些变化 1,先实现一个base64加密 import base64 impo ...

  6. python2.7之乱码问题

    python 3之后当然不存在乱码问题了.python 2的乱码问题有时就有点头疼了.(代码均为在windows下测试) 示例:保存为test1.py 报错信息如下: 解决办法: 我将代码保存为tes ...

  7. php aes128加密

    //[加密数据]AES 128 ECB模式 public function aesEncrypt($str){ $screct_key = Yii::$app->params['encryptK ...

  8. Web处理方式

    ProcessRequest 方法简称 PR方法 PR方法内部调用Page_Load方法   MVC设计模式 Model是指要处理的业务代码和数据操作代码 View视图主要是指的跟用户打交道并能够展示 ...

  9. 【Hadoop学习之十一】MapReduce案例分析三-PageRank

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...

  10. 查看完整的 Unicode 字符集

    https://unicode-table.com/cn/ 这个链接是我想要查的 格式如下图 先放这里收藏,我也不知道怎么搜索