[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语言高级_04-集合_02 泛型_6_泛型通配符
泛型通配符是一个问号 也是代表不确定的意思 换成Object两个都报错了. 泛型是没有继承概念的,所以上面写Object就会报错.这里应问号 可以代表位置类型 it.next会自动用Object接收 ...
- 安全运维 - Linux系统攻击应急响应
Linux 应急相应 - 总纲 应急准备: 制定应急策略 组建应急团队 其他应急资源 安全事件处理: 痕迹数据获取 分析.锁定攻击源删除可疑账号关闭异常进程.端口禁用相应异常开机启动项删除异常定时任务 ...
- C++ 中赋值运算符重载以及深拷贝浅拷贝解析
转载自:http://blog.csdn.net/business122/article/details/21242857 关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 ...
- ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.
在做多表映射查询时,在同一个resultMap中写了1:1映射和1:n映射,结果测试时报错如下: org.apache.ibatis.exceptions.PersistenceException: ...
- C#Exception 追踪异常位置
1:在编写软件时,保护关键位置的代码正常运行,要对这位置进行异常处理try catch private void StartTCPServer() { try { ........//我们要确保知道这 ...
- [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...
- java视频资源
1.Java基础阶段 尚学堂_刘凯立_JavaSE基础视频 http://pan.baidu.com/s/1geCoY11 尚学堂_高淇_Java300集视频教程 https://pan.baidu. ...
- SCUT - 77 - 哈利波特与他的魔法杖 - 线段树
https://scut.online/p/77 线段树的一种奇怪的应用,暴力区间更新,每次update直接pushdown到底部,然后从维护底部.这样下次update的时候假如提前遇到底部就很快返回 ...
- hibernate.hbm.xml配置文件解析
转自:https://www.cnblogs.com/uoar/p/6670612.html 1. <!DOCTYPE hibernate-mapping PUBLIC "-//Hib ...
- HTTP 几种常用的认证机制
HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使 ...