传送门

Description

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。

在可以选择的课程中,有 $ 2n $ 节课程安排在 $ n $ 个时间段上。在第 $ i $个时间段上 $ (1 \leq i \leq n) $,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $ c_i $ 上课,而另一节课程在教室 $ d_i $ 进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 $ n $ 节安排好的课程。如果学生想更换第i节课程的教室,则需要提出申请。若申请通过,学生就可以在第 $ i $ 个时间段去教室 $ d_i $ 上课,否则仍然在教室 $ c_i $ 上课。

由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 $ i $ 节课程的教室时,申请被通过的概率是一个已知的实数 $ k_i $,并且对于不同课程的申请,被通过的概率是互相独立的。

学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多 $ m $ 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 $ m $ 门课程,也可以不用完这 $ m $ 个申请的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课问时间从一间教室赶到另一间教室。

牛牛所在的大学有 $ v $ 个教室,有 $ e $ 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。当第 $ i \((\) 1 \leq i \leq n - 1 $)节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

Solution

\(floyed\)算出每个教室之间的最短路

\(f_{i,j,0/1}\)表示前\(i\)个教室,申请了\(j\)个,第\(i\)间教室有无申请的期望值

考虑第\(i-1\)个教室是否有选进行转移即可

Code 

#include<bits/stdc++.h>
#define ll long long
#define db double
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=2005,MV=305;
const db inf=1e30;
db p[MN],f[MN][MN][2];
int d[MN][MN];
int N,M,V,E,C[MN],D[MN];
#define rw(x,y) x=min(x,y)
int main()
{
memset(d,0x3f,sizeof d);
N=read(),M=read(),V=read(),E=read();
reg int i,j,k,x,y,z;
for(i=1;i<=N;++i)C[i]=read();
for(i=1;i<=N;++i)D[i]=read();
for(i=1;i<=N;++i)scanf("%lf",&p[i]);
for(i=1;i<=E;++i)
x=read(),y=read(),z=read(),
rw(d[x][y],z),rw(d[y][x],z); for(k=1;k<=V;++k)for(i=1;i<=V;++i)for(j=1;j<=V;++j)
rw(d[i][j],d[i][k]+d[k][j]);
for(i=1;i<=V;++i)d[i][0]=d[0][i]=d[i][i]=0;
for(i=1;i<=N;++i)for(j=0;j<=M;++j)f[i][j][0]=f[i][j][1]=inf;
for(i=1;i<=N;++i)for(j=0;j<=M&&j<=i;++j)
{
if(i-2>=j)rw(f[i][j][0],f[i-1][j][0]+d[C[i-1]][C[i]]);
if(i-1>=j)rw(f[i][j][0],f[i-1][j][1]+d[C[i-1]][C[i]]*(1-p[i-1])+d[D[i-1]][C[i]]*p[i-1]);
if(i-1>=j&&j>0)rw(f[i][j][1],f[i-1][j-1][0]+d[C[i-1]][D[i]]*p[i]+d[C[i-1]][C[i]]*(1-p[i]));
if(j>0)rw(f[i][j][1],f[i-1][j-1][1]+d[C[i-1]][C[i]]*(1-p[i-1])*(1-p[i])+
d[C[i-1]][D[i]]*(1-p[i-1])*p[i]+d[D[i-1]][C[i]]*p[i-1]*(1-p[i])+d[D[i-1]][D[i]]*p[i-1]*p[i]);
}
db ans=inf;
for(i=0;i<=M;++i)rw(ans,f[N][i][0]),rw(ans,f[N][i][1]);
printf("%.2lf\n",ans);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「NOIP2016」换教室的更多相关文章

  1. LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】

    LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变 ...

  2. [LOJ] #2360. 「NOIP2016」换教室

    期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...

  3. 「NOIP2016」「P1850」 换教室(期望dp

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

  4. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)

    题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...

  5. 「NOIP2016」天天爱跑步 题解

    (声明:图片来源于网络) 「NOIP2016」天天爱跑步 题解 题目TP门 题目 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  6. 「 Luogu P1850 」 换教室

    解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ ...

  7. [NOIP2016][luogu]换教室[DP]

    [NOIP2016] Day1 T3 换教室 ——!x^n+y^n=z^n 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程 ...

  8. 【BZOJ4720】【NOIP2016】换教室 [期望DP]

    换教室 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行四个整数n,m,v ...

  9. 【NOIP2016】换教室 题解(期望DP)

    前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...

随机推荐

  1. Jmeter的安装与配置。

    1.本机配置好JAVA环境. 2.官网下载压缩包,在任意目录下解压. 3.修改配置文件 ,打开Jmeter的bin目录下jmeter.porperties,修改 language=zh_CN samp ...

  2. jQuery---bootstrap的下载使用,栅格(12个格子),轮播图,矢量图字体图标,进度条,选项卡,标签,表达校验

    jQuery---bootstrap的下载使用,栅格(12个格子),轮播图,矢量图字体图标,进度条,选项卡,标签,表达校验 一丶bootstrap的使用 下载资源文件: bootstrap官网 导入 ...

  3. Vue -- 项目报错整理(2):IE报错 - ‘SyntaxError:strict 模式下不允许一个属性有多个定义‘ ,基于vue element-ui页面跳转坑的解决

  4. Golang中文乱码问题

    在学习golang读取文件的过程中,遇到中文显示乱码的问题!golang没有自带的编解码包,因此需要借助第三方包 解决方法: 引入第三发转码包:git clone https://github.com ...

  5. JAVA项目从运维部署到项目开发(四. Tomcat)

    一.关于中文乱码问题 文件目录:/conf/server.xml 将相关语句改为: <Connector port="8008" protocol="HTTP/1. ...

  6. vue脚手架引入MD5加密函数

    可以在全局定义一个MD5的方法,然后引入到vue的脚手架中. 首先 npm install crypto --save 然后引用定义一个对象, import crypto from 'crypto'; ...

  7. day 33

    目录 数据库是什么 为什么使用数据库 数据库的分类 关系型(把数据保存在硬盘里) 非关系型(把数据保存在内存里) mysql的架构 初识mysql 操作数据库 增 删 改 查 数据库是什么 数据库即存 ...

  8. MySQL IFNULL() 函数

    MySQL函数 IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值. IFNULL() 函数语法格式为: IF ...

  9. MySQL 自带的4个系统数据库的说明

    自带的4个系统数据库:information_schema.mysql.performance_schema.sys: information_schema:这个数据库保存了mysql服务器所有数据库 ...

  10. 【原】python 检查网站访问是否超时,并用钉钉机器人报警

    #!/usr/bin/env python import requests import json import logging webhook="上面创建钉钉机器人的webhook地址&q ...