【学术篇】NOIP2016 D1T3 luogu1850换教室
题目链接:点击这里献出你宝贵的时间(是用来做题不是捐赠Emmmm)..
Emmmm我太弱了= =
做完这题我觉得我应该去打星际..这题怎么就有重边了呢..
这题就是一道期望= =当时考场上好像完全不会期望,dp一直也都不会推式子= =
然后就用floyd水掉了没有期望的点,分数还是太少了,最后就省二滚粗了..
现在觉得应该在NOIP2017之前学习一下期望,然后就想起了这道题,lhr大佬之前也做了这道题但好像没做完??然后就和我一起做= =他代码跑飞快我也不知道为啥= =
好吧言归正传,这题就是floyd+dp,当然了这题当然和期望有关,你要接下去看我就默认你对期望有所了解了哈= =不然去找度娘问问去= = 数学期望
由于我们要求出多源最短路,所以floyd.. 而且v<=300不是嘛..
n和v真的挺坑的,刚开始还RE了不少遍啊= =
Emmmm,我们发现由于只有上一节课的选择会影响到即将加一条边的期望值,所以我们可以dp(其实我不知道为什么嘛~)
我们设f[i][j][0/1]表示处理第i节课,已经申请了j次,这次选择/不选择申请的期望…
这样的话状态转移方程就呼之欲出了(不存在的,年轻人,要多想):
然而要做很复杂的分类讨论:
*我们先做一下符号的声明:
*- pre[i]表示第i节本来的安排
*- now[i]表示第i次申请能换到的教室
*- p[i]表示第i次申请通过的概率
*- dis[i][j]表示i,j间的距离
- 这次不申请,我们更新f[i][j][0]的值,那么新加的边的终点就是pre[i]..
1.如果上次不申请,那么新加的边的起点就是pre[i-1],不需要考虑期望..
2.如果上次申请了,那么成功了起点就是now[i-1],不成功起点就是pre[i-1]
所以:
f[i][j][0]=min(
f[i-1][j][0]+dis[pre[i-1]][pre[i]],
f[i-1][j][1]+dis[now[i-1]][pre[i]]*p[i-1] //若上一次申请成功
+dis[pre[i-1]][pre[i]]*(1-p[i-1]) //若上一次申请不成功
//根据期望的性质易得,申请成功时的期望*成功率+不成功的期望*不成功率
);
- 而这次申请的话,我们更新f[i][j][1]的值,
1.如果上次不申请,起点就是pre[i-1]…终点还是根据期望的性质推:
f[i-1][j-1][0]+ //这次申请所以之前申请j-1次
dis[pre[i-1]][now[i]]*p[i] //这次申请成功
+dis[pre[i-1]][pre[i]]*(1-p[i]) //这次申请不成功
2.如果上次申请,起点和终点我们就要根据期望的性质枚举一下(太麻烦了= =)
f[i-1][j-1][1]+
dis[now[i-1]][now[i]]*p[i-1]*p[i] //两次申请都成功
+dis[now[i-1]][pre[i]]*p[i-1]*(1-p[i]) //上次申请成功,这次不成功
+dis[pre[i-1]][now[i]]*(1-p[i-1])*p[i] //上次申请不成功,这次成功
+dis[pre[i-1]][pre[i]]*(1-p[i-1])*(1-p[i]) //两次申请都不成功
然后我们就对以上两个式子取一下min:
f[i][j][1]=min(
f[i-1][j-1][0]+dis[pre[i-1]][now[i]]*p[i]+dis[pre[i-1]][pre[i]]*(1-p[i]),
f[i-1][j-1][1]+dis[now[i-1]][now[i]]*p[i-1]*p[i]+dis[now[i-1]][pre[i]]*p[i-1]*(1-p[i])+dis[pre[i-1]][now[i]]*(1-p[i-1])*p[i]+dis[pre[i-1]][pre[i]]*(1-p[i-1])*(1-p[i])
)
Emmmm这个状态转移方程看上去很简单不是么(大雾)
边界条件的话,
f[1][0][0]=f[1][1][1]=0;
然后一路推过去就行了~~
代码:
#include <cstdio>
const int V = 303;
const int N = 2002;
template<class T>
inline T min(const T &a, const T &b) {
if (a<b) return a; return b;
}
int d[V][V], n, m, v, e;
double f[N][N][2];
struct apply {
double p; int pre, now;
}a[N];
void floyd() {
for (int k = 1; k <= v; k++)
for (int i = 1; i <= v; i++)
for (int j = 1; j <= v; j++)
if (i != j&&i != k&&k != j)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
inline int getint() {
int a = 0; char c = getchar(); bool f = 0;
for (; (c<'0' || c>'9') && c != '-'; c = getchar());
if (c == '-') f = 1, c = getchar();
for (; c >= '0'&&c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + c - '0';
if (f) return -a; return a;
}
int main() {
n = getint(), m = getint(), v = getint(), e = getint();
for (int i = 1; i <= n; i++) a[i].pre = getint();
for (int i = 1; i <= n; i++) a[i].now = getint();
for (int i = 1; i <= n; i++) scanf("%lf", &a[i].p);
for (int i = 0; i <= v; i++) for (int j = 0; j <= v; j++) d[i][j] = 0x3fffffff;
for (int i = 0; i <= v; i++) d[i][i] = 0;
for (int i = 1; i <= e; i++) { int x = getint(), y = getint(); d[x][y] = d[y][x] = min(d[x][y], getint()); }floyd();
for (int i = 1; i <= n; i++) for (int j = 0; j <= m; j++) f[i][j][0] = f[i][j][1] = 0x3fffffff;
f[1][0][0] = f[1][1][1] = 0;
for (int i = 2; i <= n; i++)
for (int j = 0; j <= m; j++) {
f[i][j][0] = min(
f[i - 1][j][0] + d[a[i - 1].pre][a[i].pre],
f[i - 1][j][1] + d[a[i - 1].now][a[i].pre] * a[i - 1].p + d[a[i - 1].pre][a[i].pre] * (1 - a[i - 1].p)
);
if(j) f[i][j][1] = min(
f[i - 1][j - 1][0] + d[a[i - 1].pre][a[i].now] * a[i].p + d[a[i - 1].pre][a[i].pre] * (1 - a[i].p),
f[i - 1][j - 1][1] + d[a[i - 1].now][a[i].now] * a[i - 1].p * a[i].p
+ d[a[i - 1].now][a[i].pre] * a[i - 1].p * (1 - a[i].p)
+ d[a[i - 1].pre][a[i].now] * (1 - a[i - 1].p) * a[i].p
+ d[a[i - 1].pre][a[i].pre] * (1 - a[i - 1].p) * (1 - a[i].p)
);
}
double ans = 1e10;
for (int i = 0; i <= m; i++) ans = min(ans, min(f[n][i][0], f[n][i][1])); printf("%.2lf", ans);
}
跑得还是挺慢的……Emmmm……
就这样吧= =
【学术篇】NOIP2016 D1T3 luogu1850换教室的更多相关文章
- [NOIp2016提高组]换教室
题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...
- NOIP2016 DAY1 T3 换教室
换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内 ...
- Luogu P1850 [NOIp2016提高组]换教室 | 期望dp
题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
- 题解 P1850 [NOIP2016 提高组] 换教室
做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ...
- [NOIP2016][luogu]换教室[DP]
[NOIP2016] Day1 T3 换教室 ——!x^n+y^n=z^n 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程 ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- 【BZOJ】4720: [Noip2016]换教室
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1690 Solved: 979[Submit][Status ...
随机推荐
- 嘶吼CTF2019总结(Web部分题目复现以及部分杂项)
easy calc 这次的比赛自己一题都没有做出来,赛后看题解的时候很难受,其实有很多东西自己其实是可以做出来的,但是思路被限制了,可能这就是菜吧. 首先web题目就是一个easy calc,emmm ...
- DLL注入技术之劫持进程创建注入
劫持进程创建注入原理是利用Windows系统中CreateProcess()这个API创建一个进程,并将第6个参数设为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行 ...
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...
- Round Numbers /// 组合计数 oj21455
题目大意: 给定a,b 输出[a,b]的闭区间中round number的数量 所谓round就是一个数在二进制下0的个数大于等于1的个数 0的个数>=1的个数 也就是1的个数<=0的个数 ...
- UVA Ananagrams /// map set
https://vjudge.net/problem/UVA-156 题目大意: 输入文本,找出所有满足条件的单词——该单词不能通过字母重排而得到输入的文本中的另外一个单词. 在判断是否满足条件时,字 ...
- JS函数 有参数的函数 参数可以多个,根据需要增减参数个数。参数之间用(逗号,)隔开
有参数的函数 上节中add2()函数不能实现任意指定两数相加.其实,定义函数还可以如下格式: function 函数名(参数1,参数2) { 函数代码 } 注意:参数可以多个,根据需要增减参数个数.参 ...
- kaggle 实战 (1): PCA + KNN 手写数字识别
文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...
- 查看ubuntu系统的版本信息
显示如下 Linux version 4.10.0-28-generic (buildd@lgw01-12) linux内核版本号 gcc version 5.4.0 20160609 gcc编译器版 ...
- windows下mysql8.0.x简单安装!
1.官网下载mysql安装包并解压到自己喜欢的目录 2.在解压的目录下,添加my.ini配置文件,内容如下:[mysqld]# 设置3306端口port=3306# 设置mysql的安装目录 下面是我 ...
- soj115 御坂网络
题意:平面上有n个A发射点和m个B发射点,可以选择安置相应A/B装置,装置范围是圆,自取半径(要求都相同且<=Rmax).异种要求范围不相交.求装置范围之和(不是并!). 标程: #includ ...