题目描述

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

在可以选择的课程中,有 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: 复制

  1. 3 2 3 3
  2. 2 1 2
  3. 1 2 1
  4. 0.8 0.2 0.5
  5. 1 2 5
  6. 1 3 3
  7. 2 3 1
输出样例#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

  1. /**
  2. * luogu
  3. * Problem#1850
  4. * Accepted
  5. * Time: 2724ms
  6. * Memory: 63597k
  7. */
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10. #define smin(_a, _b) _a = min(_a, _b)
  11. #define smax(_a, _b) _a = max(_a, _b)
  12.  
  13. const int V = ;
  14. const int N = , M = ;
  15.  
  16. int n, m, v, e;
  17. int dis[V][V];
  18. double f[N][M][];
  19. int *c, *d;
  20. double *p;
  21.  
  22. inline void init() {
  23. scanf("%d%d%d%d", &n, &m, &v, &e);
  24. c = new int[(n + )];
  25. d = new int[(n + )];
  26. p = new double[(n + )];
  27. for(int i = ; i <= n; i++)
  28. scanf("%d", c + i);
  29. for(int i = ; i <= n; i++)
  30. scanf("%d", d + i);
  31. for(int i = ; i <= n; i++)
  32. scanf("%lf", p + i);
  33. for(int i = ; i <= v; i++)
  34. for(int j = ; j <= v; j++)
  35. dis[i][j] = << ;
  36. for(int i = , u, v, w; i <= e; i++) {
  37. scanf("%d%d%d", &u, &v, &w);
  38. smin(dis[u][v], w);
  39. dis[v][u] = dis[u][v];
  40. }
  41. }
  42.  
  43. inline void floyed() {
  44. for(int i = ; i <= v; i++)
  45. dis[i][i] = ;
  46. for(int k = ; k <= v; k++)
  47. for(int i = ; i <= v; i++)
  48. for(int j = ; j <= v; j++)
  49. smin(dis[i][j], dis[i][k] + dis[k][j]);
  50. }
  51.  
  52. inline void solve() {
  53. for(int i = ; i <= n; i++)
  54. for(int j = ; j <= m; j++)
  55. f[i][j][] = f[i][j][] = 1e100;
  56. f[][][] = f[][][] = ;
  57. for(int i = ; i <= n; i++)
  58. for(int j = ; j <= m && j <= i; j++) {
  59. int &dcc = dis[c[i - ]][c[i]], &dcd = dis[c[i - ]][d[i]];
  60. int &ddc = dis[d[i - ]][c[i]], &ddd = dis[d[i - ]][d[i]];
  61. double &ip = p[i - ], &np = p[i];
  62. if(j <= i - )
  63. f[i][j][] = min(f[i - ][j][] + dcc, f[i - ][j][] + dcc * ( - ip) + ddc * ip);
  64. if(j) {
  65. smin(f[i][j][], f[i - ][j - ][] + dcc * ( - np) + dcd * np);
  66. smin(f[i][j][], f[i - ][j - ][] + ( - ip) * (dcc * ( - np) + dcd * np) + ip * (ddc * ( - np) + ddd * np));
  67. }
  68. }
  69. double ans = 1e100;
  70. for(int i = ; i <= m && i <= n; i++)
  71. for(int k = ; k < ; k++)
  72. smin(ans, f[n][i][k]);
  73. printf("%.2lf", ans);
  74. }
  75.  
  76. int main() {
  77. init();
  78. floyed();
  79. solve();
  80. return ;
  81. }

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. arcgis api for flex 开发入门

    参考:http://blog.sina.com.cn/s/articlelist_2346836525_1_1.html 参考教程:https://www.jb51.net/books/81280.h ...

  2. 加减plugin

    plugin插件↓↓ ;(function (underfined) { "use strict" var _global; //插件函数 /* var plugin = { ad ...

  3. C# 图片 旋转和翻转 RotateFlip

    1.Rotate90FlipX2.Rotate90FliY3.Rotate90FlipXY4.Rotate90FlipNone以上面四个为例:1是指定后接水平翻转的90度顺时针旋转,2是指定后接垂直翻 ...

  4. java的移位运算详解(举例说明)

    1)java中无符号右移:>>>,下面是一个int型的负数,然后每次移动一位. int k = -0x123;System.out.println(Integer.toBinaryS ...

  5. ASP.NET MVC Action返回结果类型【转】

    ASP.NET MVC 目前一共提供了以下几种Action返回结果类型: 1.ActionResult(base) 2.ContentResult 3.EmptyResult 4.HttpUnauth ...

  6. SpringMVC探究-----从HelloWorld开始

       1.SpringMVC简介 Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离. 它的设计是围绕Dispatch ...

  7. Spark学习之路 (八)SparkCore的调优之开发调优

    摘抄自:https://tech.meituan.com/spark-tuning-basic.html 前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark ...

  8. 转:【专题二】HTTP协议详解

    我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求,此时就使用了应用层的HTTP协议,在上一个专题我们简单介绍了网络协议的知识,主要是为了后 ...

  9. php小数加减精度问题,比特币计算精度问题

    php小数加减精度问题,比特币计算精度问题 在php开发时,有小数加减的场景.结果发现不能够等于预想的值,bccomp比较二个高精确度数字.语法: int bccomp(string left ope ...

  10. qt creator翻译流程

    一,下载qt creator软件包,最好是5.3,       本人是Win7,64位电脑,下载的是qt-opensource-windows-x86-mingw482_opengl-5.3.0.ex ...