[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-2 -面向对象和封装_14private关键字的作用及使用
新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_6_泛型通配符
泛型通配符是一个问号 也是代表不确定的意思 换成Object两个都报错了. 泛型是没有继承概念的,所以上面写Object就会报错.这里应问号 可以代表位置类型 it.next会自动用Object接收 ...
- 测开之路一百二十三:快速搭建python虚拟环境
前提:已装好python3.4+且环境可正常运行 一:手动搭建: 准备好一个工作目录 管理员运行cmd,进入到准备的目录里面 执行命令:python -m venv 虚拟环境名 激活虚拟环境(在ven ...
- 测开之路一百一十三:bootstrap媒体对象
实现效果,左边是图片或者其他媒体,右边是对应的描述 引入bootstrap和jquery标签 class="media" 数量多一些看着就会很规整 <!DOCTYPE htm ...
- JMeterContext----上下文
http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html org.apache.jmeter.threads ...
- python 正则表达式 re.findall &re.finditer
语法: findall 搜索string,以列表形式返回全部能匹配的子串 re.findall(pattern, string[, flags]) finditer 搜索string,返回一个顺序访问 ...
- CentOS7 修复boot目录
这里为了达到实验目的,首先删除boot目录下所有内容 重启后发现系统进不去了,这正是我们想要的 进入系统救援模式,以重新引导系统 进入救援模式后,输入以下命令进行修复boot目录 重启后,能正常引导系 ...
- python 定义模块作用及分类
python把一个功能的模块归类,简单来说,模块是一个由Python代码组成的文件.模块可以定义函数,类和变量. 模块还可以包括可运行的代码. 1,python模块的作用 提高代码的方便维护 使用模块 ...
- BZOJ 1908. Pku2054 UVA1205 Color a Tree
传送门 看一眼感觉 $dp$,发现状态没法维护 考虑贪心,然后就想了两个错的贪心... 正解好神啊 首先如果权值最大的点能够一步染色那么肯定要染它 意思就是,一旦父节点被染色那么它就要接着被染色 那么 ...
- js+css实现点击回到顶部的效果(最低兼容至ie7)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...