换教室

Time Limit: 20 Sec  Memory Limit: 512 MB
[Submit][Status][Discuss]

Description

Input

  第一行四个整数n,m,v,e。n表示这个学期内的时间段的数量;m表示牛牛最多可以申请更换多少节课程的教室;
  v表示牛牛学校里教室的数量;e表示牛牛的学校里道路的数量。
  第二行n个正整数,第i(1≤i≤n)个正整数表示c,,即第i个时间段牛牛被安排上课的教室;保证1≤ci≤v。
  第三行n个正整数,第i(1≤i≤n)个正整数表示di,即第i个时间段另一间上同样课程的教室;保证1≤di≤v。
  第四行n个实数,第i(1≤i≤n)个实数表示ki,即牛牛申请在第i个时间段更换教室获得通过的概率。保证0≤ki≤1。
  接下来e行,每行三个正整数aj,bj,wj,表示有一条双向道路连接教室aj,bj,通过这条道路需要耗费的体力值是Wj;
  保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。
  保证输入的实数最多包含3位小数。

Output

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

Sample Input

  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

Sample Output

  2.80

HINT

  1≤aj,bj≤v, 1≤wj≤100。
  1≤n≤2000, 0≤m≤2000, 1≤v≤300, 0≤e≤90000。

Main idea

  给定n个 原本教室ci 和 替换教室di,可以申请m次换课,如果 i 换课了则可以在di上课,否则在ci上课,每个教室之间有距离,求期望最小距离。

Solution

  很简单的期望DP,我们令 f[i][j][0\1] 表示 到了第 i 个状态,已经换了 j 次课,这次换不换课,然后分四种情况讨论一下即可。

Code

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; #define Road(a,b) (double)w[a][b]
#define tense(a,b) a = a<b ? a:b; const int ONE = ;
const double INF = 1e18; int n,m,v,e;
int x,y,z;
int c[ONE],d[ONE];
int w[][];
double f[ONE][ONE][],k[ONE];
double Ans; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Floyed()
{
for(int k=; k<=v; k++)
for(int i=; i<=v; i++)
for(int j=; j<=v; j++)
tense(w[i][j], w[i][k] + w[k][j]);
} double Eap10(int i)
{
return Road( c[i],c[i+] ) * (-k[i]) + Road( d[i],c[i+] ) * k[i];
} double Eap01(int i)
{
return Road( c[i],c[i+] ) * (-k[i+]) + Road( c[i],d[i+] ) * k[i+];
} double Eap11(int i)
{
return
Road( c[i], c[i+] ) * (-k[i]) * (-k[i+])
+ Road( c[i], d[i+] ) * (-k[i]) * k[i+]
+ Road( d[i], c[i+] ) * k[i] * (-k[i+])
+ Road( d[i], d[i+] ) * k[i] * k[i+];
} void DisApply(int i,int j)
{
if(j>=) f[i+][j][] = tense(f[i+][j][], f[i][j][] + Road( c[i],c[i+] ) );
if(j>=) f[i+][j][] = tense(f[i+][j][], f[i][j][] + Eap10(i) );
} void Apply(int i,int j)
{
if(j>=) f[i+][j][] = tense(f[i+][j][], f[i][j-][] + Eap01(i) );
if(j>=) f[i+][j][] = tense(f[i+][j][], f[i][j-][] + Eap11(i) );
} int main()
{
n = get(); m = get(); v = get(); e = get();
for(int i=; i<=n; i++) c[i] = get();
for(int i=; i<=n; i++) d[i] = get();
for(int i=; i<=n; i++) scanf("%lf", &k[i]); memset(w, , sizeof(w));
for(int i=; i<=v; i++) w[i][i] = ;
for(int i=; i<=e; i++)
{
x = get(); y = get(); z = get();
w[x][y] = min(w[x][y], z);
w[y][x] = min(w[y][x], z);
}
Floyed(); for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
f[i][j][] = f[i][j][] = INF;
f[][][] = f[][][] = ; for(int i=; i<=n-; i++)
for(int j=; j<=m; j++)
DisApply(i,j), Apply(i,j); Ans = INF;
for(int j=; j<=m; j++)
{
tense(Ans, f[n][j][]);
tense(Ans, f[n][j][]);
} printf("%.2lf",Ans);
}

【BZOJ4720】【NOIP2016】换教室 [期望DP]的更多相关文章

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

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

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

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

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

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

  4. JZYZOJ1457 [NOIP2016]换教室 期望dp 动态规划 floyd算法 最短路

    http://172.20.6.3/Problem_Show.asp?id=1457 我不知道为什么我倒着推期望只有80分,所以我妥协了,我对着题解写了个正的,我有罪. #include<cst ...

  5. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  6. [NOIP2016]换教室 期望dp

    先弗洛伊德,然后把状态拆分遗传 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  7. 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...

  8. 换教室(期望+DP)

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

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

    传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...

随机推荐

  1. 【IdentityServer4文档】- 支持协议

    IdentityServer 实现了以下协议: OpenID Connect OpenID Connect Core 1.0 (spec) OpenID Connect Discovery 1.0 ( ...

  2. C++并行编程1

    what is concurrency 我们可以一边看电视,一边唱歌.人并行非常容易理解,但是计算机呢?是不是我们一边编辑着word文档,一边听着歌,这样计算机就是在并行吗?不一定欧,如果你计算机是单 ...

  3. IIS安装出现“安装程序无法复制文件CONVLOG.EX_”的解决办法

    重新安装了一次IIS,结果就在重新安装的时候,出现安装程序无法复制文件CONVLOG.EX_,上网找了找资料,是因为secedit.sdb 数据库的问题,既然是因为这个文件的问题,那么我们就可以使用w ...

  4. phpmyadmin打开空白

    本地phpstudy环境,打开 phpmyadmin,登陆之后,显示空白页面. 解决办法:切换为 低版本的php版本,正常登陆.

  5. (转)Linux NUMA引发的性能问题

    最近某客户的核心业务系统又出了翻译缓慢的情况.该问题在6月份也出现过,当时进行了一次调整. 我们首先来看下故障时间段的awr报告: 单纯的从TOP 5 event,基本上是看不出任何东西的,可能有人会 ...

  6. C运行时库

    原文地址:http://blog.csdn.net/wqvbjhc/article/details/6612099 在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这 ...

  7. Java设计

    重构前 CustomDataChar | getConnection()findCustomers()createChar()displayChar() 重构后 CustomDataChar | da ...

  8. 【python】用 sqlacodegen 将存在的数据库表 转化成model.py

    Flask的sqlalchemy对数据库表的模型提供了很多易用的方法.为了使用这些内容,需要将数据库表按照Flask识别的格式创建成Model,但是一般我们都是在已经创建好的数据库环境中开发Pytho ...

  9. 【poj2104】K-th Number 主席树

    题目描述 You are working for Macrohard company in data structures department. After failing your previou ...

  10. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...