[NOIP2016][luogu]换教室[DP]
[NOIP2016] Day1 T3 换教室
——!x^n+y^n=z^n
题目描述
对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。
在可以选择的课程中,有 2n 节课程安排在 nn 个时间段上。在第 i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 ci 上课,而另一节课程在教室 di 进行。
在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 n 节安排好的课程。如果学生想更换第 ii 节课程的教室,则需要提出申请。若申请通过,学生就可以在第 i 个时间段去教室 di 上课,否则仍然在教室 ci 上课。
由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 ii 节课程的教室时,申请被通过的概率是一个已知的实数 k_iki,并且对于不同课程的申请,被通过的概率是互相独立的。
学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多m 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的m 门课程,也可以不用完这m 个申请的机会,甚至可以一门课程都不申请。
因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。
牛牛所在的大学有v 个教室,有e 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 i节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。
现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。
输入输出格式
输入格式:
第一行四个整数 n,m,v,e。n 表示这个学期内的时间段的数量;m 表示牛牛最多可以申请更换多少节课程的教室;v 表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量。
第二行 n 个正整数,第 i(1≤i≤n)个正整数表示 ci,即第 i 个时间段牛牛被安排上课的教室;保证 1≤ci≤v。
第三行 n 个正整数,第 i(1 \leq i \leq n1≤i≤n)个正整数表示 di,即第 ii 个时间段另一间上同样课程的教室;保证1≤di≤v。
第四行 n 个实数,第 i(1≤i≤n)个实数表示 ki,即牛牛申请在第 ii 个时间段更换教室获得通过的概率。保证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。
保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。
保证输入的实数最多包含 33 位小数。
输出格式:
输出一行,包含一个实数,四舍五入精确到小数点后恰好22位,表示答案。你的输出必须和标准输出完全一样才算正确。
测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 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
首先,因为教室数量较少,我们可以先用floyd预处理出任意两个教室距离。
注意到概率的相对独立,那么我们可以采用动态规划,用状态dp[i][j]表示上了前面i节课,用了j次申请的期望最优值,但这样会发现转移的时候出了问题,对于此用dp[i][j][0…1]表示状态,0表示该位置不申请,1表示申请。
转移:
dp[i][j][0]=Min{dp[i-1][j][0]+dis[s[i-1]][s[i]],//第i-1个也不取
dp[i-1][j][1]+dis[t[i-1]][s[i]]*p[i-1]+dis[s[i-1]][s[i]]*(1-p[i-1])//第i-1个取,注意取与不取对应的概率都要计算
};
下面类似,只是有点恶心…
dp[i][j][1]=Min{dp[i-1][j][0]+dis[s[i-1]][t[i]]*p[i]+dis[s[i-1]][s[i]]*(1-p[i]),
dp[i-1][j][1]+dis[s[i-1]][s[i]]*(1-p[i-1])*(1-p[i])+dis[s[i-1]][t[i]]*(1-p[i-1])*p[i]+
dis[t[i-1]][s[i]]*p[i-1]*(1-p[i])+dis[t[t-1]][t[i]]*p[i-1]*p[i]
};
总的方程转移还是比较好想的,只不过是概率期望比较坑,还有就是边界处理:
dp[1][0][0]=dp[1][1][1]=0;
上代码...
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int read();
int Min(int x,int y){return x<y?x:y;}
?y:x;}
namespace lys{
;
;
],p[M];
double ans;
int n,m,v,e;
int dis[M][M],s[M],t[M];
void init(){
int i,j;
;i<=v;i++)
;j<=v;j++){
if(i==j) continue ;
dis[i][j]=inf;
}
;i<=n;i++)
;j<=m;j++) dp[i][j][]=dp[i][j][]=inf;
dp[][][]=dp[][][]=;
}
int main(){
int i,j,k,x,y,w;
n=read(); m=read(); v=read(); e=read();
;i<=n;i++) s[i]=read();
;i<=n;i++) t[i]=read();
;i<=n;i++) scanf("%lf",&p[i]);
init();
;i<=e;i++) x=read(),y=read(),w=read(),dis[x][y]=dis[y][x]=Min(dis[x][y],w);
;k<=v;k++)
;i<=v;i++)
;j<=v;j++)
dis[i][j]=Min(dis[i][j],dis[i][k]+dis[k][j]);
;i<=n;i++){
;j<=m;j++){
dp[i][j][]=dp[i-][j][]+dis[s[i-]][s[i]];
dp[i][j][]=MIN(dp[i][j][],dp[i-][j][]+dis[t[i-]][s[i]]*p[i-]+dis[s[i-]][s[i]]*(-p[i-]));
) dp[i][j][]=dp[i-][j-][]+dis[s[i-]][t[i]]*p[i]*(-p[i-])+dis[s[i-]][s[i]]*(-p[i])*(-p[i-])+dis[t[i-]][s[i]]*p[i-]*(-p[i])+dis[t[i-]][t[i]]*p[i-]*p[i];
) dp[i][j][]=MIN(dp[i][j][],dp[i-][j-][]+dis[s[i-]][t[i]]*p[i]+dis[s[i-]][s[i]]*(-p[i]));
}
}
ans=dp[n][][];
;i<=m;i++) ans=MIN(MIN(dp[n][i][],dp[n][i][]),ans);
printf("%.2f",(ans));
;
}
}
int main(){
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
lys::main();
fclose(stdin);
fclose(stdout);
;
}
inline int read(){
,ff=;
char c=getchar();
'){
;
c=getchar();
}
+c-',c=getchar();
return kk*ff;
}
[NOIP2016][luogu]换教室[DP]的更多相关文章
- 【BZOJ4720】【NOIP2016】换教室 [期望DP]
换教室 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行四个整数n,m,v ...
- 【NOIP2016】换教室 题解(期望DP)
前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...
- P1850 换教室[dp+期望]
流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...
- [NOIP2016 D1T3]换教室 【floyd+概率dp】
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】
LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变 ...
- 【NOIP2016】换教室(DP,期望)
题意: 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程 ...
- 【NOIP2016】换教室(动态规划)
题目戳我 题解 其实感觉16年的难度不是很大???? 这道题去年考场上DP都想出来了... 只是因为不会数学期望...然后GG.... 这道题目只要把数学期望搞出来就可以啦 设f[i][j][0/1] ...
- UOJ262 【NOIP2016】换教室
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【NOIP2016】换教室
题目描述 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_5_flush方法和close方法的区别
flush之后,还可以继续使用流写文件
- try...catch语句
程序的异常:Throwable 严重问题Error我们不处理,这种问题一般都是很严重的,比如内存溢出 问题Exception 编译期问题不是RuntimeException的异常必须进行处理,如果不处 ...
- Openssl ASN.1 说明一 分享
[引言]ASN.1全称为Abstract Syntax NotationOne,是一种描述数字对象的方法和标准.openssl的编码方法就是基于该标准的,目前,很多其他软件的编码方法也是基于该标准.对 ...
- vue-methods方法与computed计算属性的差别
好吧,我就是单纯的举个例子:实现显示变量 message 的翻转字符串 第一种:methods:我们可以通过在表达式中调用方法来达到同样的效果: 第二种:computed:计算属性 上面的2中方法都实 ...
- Java反序列化漏洞整理
Fastjson 反序列化 CVE-- Fastjson 利用版本范围为 Fastjson 及之前的版本 Struts2 S2-, S2-, S2-, S2-, S2-, S2-, S2-, S2-, ...
- 002/Node.js(Mooc)--Http知识
1.什么是Http 菜鸟教程:http://www.runoob.com/http/http-tutorial.html 视频地址:https://www.imooc.com/video/6713 h ...
- JS屏蔽鼠标右键
//方法1: function stop() { return false;}document.oncontextmenu = stop;//方法2: window.document.oncon ...
- [2019杭电多校第三场][hdu6608]Fansblog
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6608 大致题意是比p小的最大素数q,求q!%p的值. 由威尔逊定理开始推: $(p-1)!\equiv ...
- 06-File-文件
文件 长久保存信息的一种数据信息集合 常用操作 打开关闭(文件一旦打开,需要关闭操作) 读写内容 查找 open函数 open函数负责打开文件,带有很多参数 第一个参数: 必须有,文件的路径和名称 m ...
- Spark Streaming 单词计数
Receiver 从数据源接收数据,然后把数据存储在内存中供spark streaming使用,在本地运行spark streaming不能设置master为local或者local[1],此时运行的 ...