题目描述

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

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

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

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

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

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

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

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

输入格式

第一行四个整数 n,m,v,en,m,v,en,m,v,e。nnn 表示这个学期内的时间段的数量;mmm 表示牛牛最多可以申请更换多少节课程的教室;vvv 表示牛牛学校里教室的数量;eee表示牛牛的学校里道路的数量。

第二行 nnn 个正整数,第 iii(1≤i≤n1 \leq i \leq n1≤i≤n)个正整数表示 cic_ici​,即第 iii 个时间段牛牛被安排上课的教室;保证 1≤ci≤v1 \le c_i \le v1≤ci​≤v。

第三行 nnn 个正整数,第 iii(1≤i≤n1 \leq i \leq n1≤i≤n)个正整数表示 did_idi​,即第 iii 个时间段另一间上同样课程的教室;保证 1≤di≤v1 \le d_i \le v1≤di​≤v。

第四行 nnn 个实数,第 iii(1≤i≤n1 \leq i \leq n1≤i≤n)个实数表示 kik_iki​,即牛牛申请在第 iii 个时间段更换教室获得通过的概率。保证 0≤ki≤10 \le k_i \le 10≤ki​≤1。

接下来 eee 行,每行三个正整数 aj,bj,wja_j, b_j, w_jaj​,bj​,wj​,表示有一条双向道路连接教室 aj,bja_j, b_jaj​,bj​,通过这条道路需要耗费的体力值是 wjw_jwj​;保证 1≤aj,bj≤v1 \le a_j, b_j \le v1≤aj​,bj​≤v, 1≤wj≤1001 \le w_j \le 1001≤wj​≤100。

保证 1≤n≤20001 \leq n \leq 20001≤n≤2000,0≤m≤20000 \leq m \leq 20000≤m≤2000,1≤v≤3001 \leq v \leq 3001≤v≤300,0≤e≤900000 \leq e \leq 900000≤e≤90000。

保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。

保证输入的实数最多包含 333 位小数。

输出格式

输出一行,包含一个实数,四舍五入精确到小数点后恰好222位,表示答案。你的输出必须和标准输出完全一样才算正确。

测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 4×10−34 \times 10^{-3}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

说明/提示

【样例1说明】

所有可行的申请方案和期望收益如下表:

【提示】

  1. 道路中可能会有多条双向道路连接相同的两间教室。 也有可能有道路两端连接的是同一间教室。
  2. 请注意区分n,m,v,e的意义, n不是教室的数量, m不是道路的数量。

特殊性质1:图上任意两点 aia_iai​, bib_ibi​, aia_iai​≠ bib_ibi​间,存在一条耗费体力最少的路径只包含一条道路。

特殊性质2:对于所有的 1≤i≤n1≤ i≤ n1≤i≤n, ki=1k_i= 1ki​=1 。

dp[i][j][k] 表示第i节课换了j次,上一次换还是没换(k=0,1)最小的期望值;

我们根据上节课换没换推出上节课的位置和现在的位置;

最短路不用说;

因为是期望,所以每次你要乘上成功和不成功的概率;

如果没换就直接加;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=;
const double inf=1e9+;
int n,m,v,e;
int g[][];
int dis[][];
int c[maxn],d[maxn];
double k[maxn];
double dp[maxn][maxn][];
int main()
{
memset(dis,0x3f,sizeof(dis));
scanf("%d%d%d%d",&n,&m,&v,&e);
for(int i=;i<=n;i++) scanf("%d",&c[i]);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=n;i++) scanf("%lf",&k[i]); for(int i=;i<=e;i++)
{
int qw,we,er;
scanf("%d%d%d",&qw,&we,&er);
dis[qw][we]=min(er,dis[qw][we]);
dis[we][qw]=min(er,dis[we][qw]);
}
for(int kq=;kq<=v;kq++) for(int i=;i<=v;i++) for(int j=;j<=v;j++)
{
if(dis[i][j]>dis[i][kq]+dis[kq][j]) dis[i][j]=dis[i][kq]+dis[kq][j];
}
for(int i=;i<=n;i++) for(int j=;j<=m;j++) for(int k=;k<=;k++)
dp[i][j][k]=inf;
for(int i=;i<=v;i++) dis[i][i]=dis[i][]=dis[][i]=;
dp[][][]=;dp[][][]=;
for(int i=;i<=n;i++)
{
dp[i][][]=dp[i-][][]+dis[c[i-]][c[i]];
for(int j=;j<=min(i,m);j++)
{
double last=min(dp[i-][j][]+dis[c[i-]][c[i]],dp[i-][j][]+dis[c[i-]][c[i]]*(-k[i-])+dis[d[i-]][c[i]]*k[i-]);
dp[i][j][]=min(dp[i][j][],last);
double last1=dp[i-][j-][]+dis[c[i-]][c[i]]*(-k[i])+dis[c[i-]][d[i]]*k[i];
double last2=dp[i-][j-][]+dis[c[i-]][d[i]]*(-k[i-])*k[i]+dis[d[i-]][d[i]]*k[i]*k[i-]+dis[c[i-]][c[i]]*(-k[i-])*(-k[i])+dis[d[i-]][c[i]]*k[i-]*(-k[i]);
dp[i][j][]=min(dp[i][j][],min(last1,last2));
}
}
double ans=inf;
for(int i=;i<=m;i++) ans=min(ans,min(dp[n][i][],dp[n][i][]));
printf("%.2lf",ans);
return ;
}

double不要用memset,赋值是小数点后面的数

P1850 换教室——期望DP的更多相关文章

  1. Luogu P1850 换教室(期望dp)

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

  2. P1850 换教室 期望dp

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

  3. 换教室(期望+DP)

    换教室(期望+DP) \(dp(i,j,1/0)\)表示第\(i\)节课,申请了\(j\)次调换,这节课\(1/0\)调换. 换教室 转移的时候考虑: 上次没申请 这次也没申请 加上\(dis(fr[ ...

  4. Bzoj 4720 换教室 (期望DP)

    刚发现Bzoj有Noip的题目,只会换教室这道题..... Bzoj 题面:Bzoj 4720 Luogu题目:P1850 换教室 大概是期望DPNoip极其友好的一道题目,DP不怎么会的我想到了,大 ...

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

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

  6. 【bzoj4720】[NOIP2016]换教室 期望dp

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

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

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

  8. 【bzoj4720】[Noip2016]换教室 期望dp+最短路

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

  9. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

随机推荐

  1. Eclipse RCP难点:给Command传递参数(Object)

    这个问题网络上没有答案,国外网站上也没有,本人研究了一天,终于搞明白如何实现,实际上是Eclipse RCP的ICommandService本身就已经提供的方法,只是网络上教的都是使用IHandler ...

  2. DG环境恢复同步遇到报错ORA-00353ORA-00334以及ORA-00600[2619], [47745]

    问题说明 客户环境主库4节点RAC11.2.0.4,单实例DG环境,DG由于空间不足,导致同步中断,由于DG备库未应用的归档主库都再,本次恢复的方式,是开启dg mrp进程,自动同步追上主库. 以下遇 ...

  3. ef core数据迁移的一点小感悟

    ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...

  4. MySQL中You can't specify target table '表名'('sn_app_label') for update in FROM clause错误解决办法

    在有些时候有级联关系的数据放在了同一张表中,在写sql语句的时候可能会遇到这样的场景:我要插入两条数据,第一条是父节点,第二条是子节点,关联关系是父节点的自增长id:在写这样的sql语句时有可能就会出 ...

  5. robot framework 怎么验证搜索无记录,页面元素不存在

    假设你要验证搜索无记录,页面元素不存在,假设我搜索的文本为你好 页面展示为如下 搜索:你好 假设页面搜索有结果: 你好  class=vtext 你好1  class=vtext 你好2  class ...

  6. Canvas 绘制一个像素风电子时钟

    想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...

  7. vue-cli 运行打开浏览器

    在配置好项目之后的package.json文件中,找到运行的script,其中“serve”中增加配置“ --open” "scripts": { "serve" ...

  8. Flink系列之流式

    本文仅是自己看书.学习过程中的个人总结,刚接触流式,视野面比较窄,不喜勿喷,欢迎评论交流. 1.为什么是流式? 为什么是流式而不是流式系统这样的词语?流式系统在我的印象中是相对批处理系统而言的,用来处 ...

  9. IPTables 和 Netfilter 框架

    前言 防火墙是保护服务器的重要工具. Linux中最常用的基本防火墙软件是iptables.iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet ...

  10. Jenkins企业应用

    一,CI/CD,DevOps介绍 持续集成(Continuous Integration,CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈 持续交付(Continuous ...