4720: [Noip2016]换教室

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1690  Solved: 979
[Submit][Status][Discuss]

Description

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有2n节
课程安排在n个时间段上。在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先
被安排在教室ci上课,而另一节课程在教室di进行。在不提交任何申请的情况下,学生们需要按时间段的顺序依次完
成所有的n节安排好的课程。如果学生想更换第i节课程的教室,则需要提出申请。若申请通过,学生就可以在第i个
时间段去教室di上课,否则仍然在教室ci上课。由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛
发现申请更换第i节课程的教室时,申请被通过的概率是一个已知的实数ki,并且对于不同课程的申请,被通过的概率
是互相独立的。学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多m节课程进行申请。
这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申
请;牛牛可以申请自己最希望更换教室的m门课程,也可以不用完这m个申请的机会,甚至可以一门课程都不申请。因
为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。牛牛所在
的大学有v个教室,有e条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,
通过不同的道路耗费的体力可能会有所不同。当第i(1≤i≤n-1)节课结束后,牛牛就会从这节课的教室出发,选择一
条耗费体力最少的路径前往下一节课的教室。现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体
力值的总和的期望值最小,请你帮他求出这个最小值。

Input

第一行四个整数n,m,v,e。n表示这个学期内的时间段的数量;m表示牛牛最多可以申请更换多少节课程的教室;
v表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量。
第二行n个正整数,第i(1≤i≤n)个正整数表示c,,即第i个时间段牛牛被安排上课的教室;保证1≤ci≤v。
第三行n个正整数,第i(1≤i≤n)个正整数表示di,即第i个时间段另一间上同样课程的教室;保证1≤di≤v。
第四行n个实数,第i(1≤i≤n)个实数表示ki,即牛牛申请在第i个时间段更换教室获得通过的概率。保证0≤ki≤1。
接下来e行,每行三个正整数aj,bj,wj,表示有一条双向道路连接教室aj,bj,通过这条道路需要耗费的体力值是Wj;
保证1≤aj,bj≤v,1≤wj≤100。
保证1≤n≤2000,0≤m≤2000,1≤v≤300,0≤e≤90000。
保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。
保证输入的实数最多包含3位小数。
 

Output

输出一行,包含一个实数,四舎五入精确到小数点后恰好2位,表示答案。你的
输出必须和标准输出完全一样才算正确。
测试数据保证四舎五入后的答案和准确答案的差的绝对值不大于4*10^-3。(如果你不知道什么是浮点误差,这段话
可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理)
 

Sample Input

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

Sample Output

2.80

Solution
16年叫我去做这个就废物一个叻...
其实是很简单的期望DP,难点是怎么定义DP方程和到底怎么算期望....
看数据范围,两两点间最短路直接用$floyed$处理出来。(输入的时候两点间距离要取min!!!
然后就是转移了。定义$dp[i][j][0/1]$表示目前到了第$i$节课,当前已经申请了$j$次(包括这次),这次申不申请,为什么是申不申请而不是成功没有?这样就不能表示概率了。
所以转移方程显然,就是如果申请,加上成功的概率乘上这样两点间$dis$再加上失败的概率乘当前$dis$就是当前期望,因为还要看$i-1$的申请情况,所以如果当前不申请就可能从两个状态转移,如果申请就从四个状态转移。

$dp[i][j][0] = min(dp[i-1][j][0] + G[c[i-1]][c[i]], dp[i-1][j][1] + G[c[i-1]][c[i]] * (1.0-p[i-1]) + G[d[i-1]][c[i]] * p[i-1]);$

$if(j >= 1) dp[i][j][1] = min(dp[i-1][j-1][0] + G[c[i-1]][c[i]] * (1.0 - p[i]) + G[c[i-1]][d[i]] * p[i], dp[i-1][j-1][1] + G[c[i-1]][c[i]] * (1.0 - p[i-1]) * (1.0 - p[i])+ G[c[i-1]][d[i]] * (1.0 - p[i-1]) * p[i] + G[d[i-1]][c[i]] * (1.0 - p[i]) * p[i-1] + G[d[i-1]][d[i]] * p[i-1] * p[i]);$

这里$G$表示预处理出来的最短路。

Code

#include<bits/stdc++.h>
using namespace std; double dp[][][], G[][], p[];
int c[], d[];
int main() {
int n, m, v, e;
scanf("%d%d%d%d", &n, &m, &v, &e);
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 ++) G[i][j] = 0x3f3f3f3f;
for(int i = ; i <= e; i ++) {
int a, b; double c;
scanf("%d%d%lf", &a, &b, &c);
G[a][b] = min(G[a][b], c);
G[b][a] = G[a][b];
}
for(int i = ; i <= v; i ++) G[i][i] = ;
for(int k = ; k <= v; k ++)
for(int i = ; i <= v; i ++)
for(int j = ; j <= v; j ++)
G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++)
for(int k = ; k <= ; k ++)
dp[i][j][k] = 0x3f3f3f3f;
dp[][][] = , dp[][][] = ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= m && j <= i; j ++) {
dp[i][j][] = min(dp[i-][j][] + G[c[i-]][c[i]], dp[i-][j][] + G[c[i-]][c[i]] * (1.0-p[i-]) + G[d[i-]][c[i]] * p[i-]);
if(j >= ) {
dp[i][j][] = min(dp[i-][j-][] + G[c[i-]][c[i]] * (1.0 - p[i]) + G[c[i-]][d[i]] * p[i], dp[i-][j-][] + G[c[i-]][c[i]] * (1.0 - p[i-]) * (1.0 - p[i])
+ G[c[i-]][d[i]] * (1.0 - p[i-]) * p[i] + G[d[i-]][c[i]] * (1.0 - p[i]) * p[i-] + G[d[i-]][d[i]] * p[i-] * p[i]);
}
}
double ans = 0x3f3f3f3f;
for(int i = ; i <= m; i ++)
for(int j = ; j <= ; j ++)
ans = min(ans, dp[n][i][j]);
printf("%.2lf", ans);
}
 

【BZOJ】4720: [Noip2016]换教室的更多相关文章

  1. BZOJ 4720 [Noip2016]换教室

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

  2. bzoj 4720: [Noip2016]换教室【期望dp】

    状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...

  3. BZOJ P4720[Noip2016]换教室____solution

    题目太长不表 <--无形传送,最为致命 学习一点数学期望的基础,预处理最短路,然后加上DP即可.(废话) 理解决策和结果的差别: 在这里每阶段的决策有两个:申请|不申请 结果有两个:换|不换 然 ...

  4. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

  5. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  6. [NOIP2016]换教室 题解(奇怪的三种状态)

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

  7. NOIP2016换教室 BZOJ 4720

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

  8. 【bzoj4720】[NOIP2016]换教室

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

  9. [NOIp2016] 换教室

    题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...

随机推荐

  1. SolrJ案例实现搭建环境——(十五)

    案例

  2. vue总结 04过渡--进入/离开 列表过渡

    进入/离开 & 列表过渡 概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CS ...

  3. mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by

    在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause ...

  4. openlayers常用操作

    1.坐标转换 根据当前坐标系与目标坐标系进行转换ol.proj.transform(coordinate, source, destination);  //coordinate:数组:source: ...

  5. Codefroces 628B New Skateboard(数位+思维)

    题目链接:http://codeforces.com/contest/628/problem/B 题目大意:给你一段数字串s(1?≤?|s|?≤?3·10^5),求该字符串有多少子串是4的倍数.解题思 ...

  6. (六)MyBatis杂项

    第一节:处理CLOB.BLOB类型数据 第二节:传入多个输入参数 第三节:MyBatis分页 1,逻辑分页 2,物理分页 MyBatis默认情况下,MyBatis启用一级缓存,即同一个SqlSessi ...

  7. the server ssl certificate failed to verify

    很久没上传项目之后,远程端断开联系 如果是git,就git clone,重新把项目拉下来. svn的话,就svn ls,拉下项目.

  8. 可怕的线程上下文类装载器(TCCL)

    在明天的 OSGi 2012 社区活动上,我将以"如何使你的类库在不依赖 OSGi 的情况下进行友好地 OSGi"为主题进行演讲.在演讲中我将会提及 Java 的线程上下文类加载器 ...

  9. Ubuntu 14.04 16.04 Linux nvidia 驱动下载与安装

    Ubuntu 14.04 16.04 nvidia 驱动安装 最简单直观的方式是在如下的对话框中直接选择驱动安装即可 但是有时候,驱动不够新,比如14.04用的是340.98版本,如果手动安装驱动可以 ...

  10. jmock2.5 基本教程

    目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...