题目大意:
  有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]。
  你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]。
  教室是图上的一些点,其中每条边都有边权。
  问你上完所有课走的总路程的期望。

思路:
  动态规划。
  f[i][j][0/1]表示上了i个课,换了j次教室,这门课有没有换教室。
  转移方程为:
  f[i][j][0]=min(f[i-1][j][0]+dis[c[i-1]][c[i]],f[i-1][j][1]+dis[c[i-1]][c[i]]*(1-k[i-1])+dis[d[i-1]][c[i]]*k[i-1]);
  f[i][j][1]=min(f[i-1][j-1][0]+dis[c[i-1]][d[i]]*k[i]+dis[c[i-1]][c[i]]*(1-k[i]),f[i-1][j-1][1]+dis[d[i-1]][d[i]]*k[i-1]*k[i]+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i])+dis[c[i-1]][d[i]]*(1-k[i-1])*k[i]+dis[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i]));

 #include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
const int N=,M=,V=;
int c[N],d[N],dis[V][V];
double k[N],f[][M][];
int main() {
int n=getint(),m=getint(),v=getint(),e=getint();
for(register int i=;i<n;i++) c[i]=getint();
for(register int i=;i<n;i++) d[i]=getint();
for(register int i=;i<n;i++) scanf("%lf",&k[i]);
for(register int i=;i<=v;i++) {
for(register int j=;j<=v;j++) {
if(i!=j) dis[i][j]=inf;
}
}
for(register int i=;i<e;i++) {
const int u=getint(),v=getint(),w=getint();
dis[u][v]=dis[v][u]=std::min(dis[u][v],w);
}
for(register int k=;k<=v;k++) {
for(register int i=;i<=v;i++) {
if(dis[i][k]==inf) continue;
for(register int j=;j<=v;j++) {
if(dis[k][j]==inf) continue;
dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(register int j=;j<=m;j++) {
f[][j][]=f[][j][]=1e9;
}
f[][][]=f[][][]=;
for(register int i=;i<n;i++) {
for(register int j=;j<=m;j++) {
f[i&][j][]=f[i&][j][]=1e9;
}
f[i&][][]=std::min(f[!(i&)][][]+dis[c[i-]][c[i]],f[!(i&)][][]+dis[c[i-]][c[i]]*(-k[i-])+dis[d[i-]][c[i]]*k[i-]);
for(register int j=;j<=m;j++) {
f[i&][j][]=std::min(f[!(i&)][j][]+dis[c[i-]][c[i]],f[!(i&)][j][]+dis[c[i-]][c[i]]*(-k[i-])+dis[d[i-]][c[i]]*k[i-]);
f[i&][j][]=std::min(f[!(i&)][j-][]+dis[c[i-]][d[i]]*k[i]+dis[c[i-]][c[i]]*(-k[i]),f[!(i&)][j-][]+dis[d[i-]][d[i]]*k[i-]*k[i]+dis[d[i-]][c[i]]*k[i-]*(-k[i])+dis[c[i-]][d[i]]*(-k[i-])*k[i]+dis[c[i-]][c[i]]*(-k[i-])*(-k[i]));
}
}
double ans=1e9;
for(register int i=;i<=m;i++) {
ans=std::min(ans,std::min(f[!(n&)][i][],f[!(n&)][i][]));
}
printf("%.2f\n",ans);
return ;
}

[NOIp2016提高组]换教室的更多相关文章

  1. Luogu P1850 [NOIp2016提高组]换教室 | 期望dp

    题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...

  2. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  3. 题解 P1850 [NOIP2016 提高组] 换教室

    做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ...

  4. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  5. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  6. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  7. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  8. noip2016 提高组

    T1 玩具谜题 题目传送门 这道题直接模拟就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm&g ...

  9. NOIP2016 DAY1 T3 换教室

    换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内 ...

随机推荐

  1. beego 相关

    bee api bapi bee run -downdoc=true -docgen=true

  2. Laravel 5.2 四、.env 文件与模型操作

    一..env文件 .env 文件是应用的环境配置文件,在配置应用参数.数据库连接.缓存处理时都会使用这个文件. // 应用相关参数 APP_ENV=local APP_DEBUG=true //应用调 ...

  3. python 学习笔记 sqlalchemy

    数据库表是一个二维表,包含多行多列.把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表 ...

  4. python基础===类的私有属性(伪私有)

    说在前面的一点: python明明有私有的定义方法就是在变量或者方法的面前加上双下滑线__,这个实际上是python的伪私有.只是一种程序员约定俗称的规定,加了就表示私有变量,但是你如果要在外部调用的 ...

  5. udpserver.pl 和 udpclient.pl

    udpserver.pl #!use/bin/perl -w use Socket; #导入Socket库 ,INADDR_ANY);#压入sockaddr_in模式,利用了全局当地压缩地点INADD ...

  6. Mysql 数据库学习笔记03 存储过程

    一.存储过程:如下           通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...

  7. jstorm系列-1:入门

    一.             Storm整体介绍 Storm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这 ...

  8. Linux下几种并发服务器的实现模式

    Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. ...

  9. Hive SQL 常用日期

    Hive SQL 常用日期 原文地址:Hive SQL常用日期函数 Hive SQL 常用日期 注意: MM DD MO TU等要大写 已知日期 要求日期 语句 结果 本周任意一天 本周一 selec ...

  10. 布隆过滤器 zz

    布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...