【bzoj4720】[NOIP2016]换教室
题目描述
输入
输出
样例输入
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
样例输出
2.80
题解
不是很难想的floyd+期望dp
f[i][j]表示前i门课程用j次机会,且第i门课程不申请换教室的最小期望,
g[i][j]表示前i门课程用j次机会,且第i门课程申请换教室的最小期望。
先用floyd求出任意两点的距离,
然后就是推来推去,不难推。
但最坑的就是:
这尼玛有重边。。。尼玛有重边。。。玛有重边。。。有重边。。。重边。。。边。。。
(题目也没说没有重边呀。。。)
注意处理。
还有memset不能用于double数组,不然会炸得很惨。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int c[2001] , d[2001] , map[301][301];
double p[2001] , f[2001][2001] , g[2001][2001];
int main()
{
int n , m , v , e , i , j , k , x , y , z;
double ans = 1000000000;
scanf("%d%d%d%d" , &n , &m , &v , &e);
for(i = 1 ; i <= n ; i ++ )
scanf("%d" , &c[i]);
for(i = 1 ; i <= n ; i ++ )
scanf("%d" , &d[i]);
for(i = 1 ; i <= n ; i ++ )
scanf("%lf" , &p[i]);
for(i = 1 ; i <= v ; i ++ )
{
for(j = 1 ; j <= v ; j ++ )
map[i][j] = 1000000000;
map[i][i] = 0;
}
for(i = 1 ; i <= e ; i ++ )
{
scanf("%d%d%d" , &x , &y , &z);
map[x][y] = map[y][x] = min(map[x][y] , z);
}
for(k = 1 ; k <= v ; k ++ )
for(i = 1 ; i <= v ; i ++ )
for(j = 1 ; j <= v ; j ++ )
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
for(i = 1 ; i <= n ; i ++ )
for(j = 0 ; j <= m ; j ++ )
f[i][j] = g[i][j] = 1000000000;
f[1][0] = g[1][1] = 0;
for(i = 2 ; i <= n ; i ++ )
{
f[i][0] = f[i - 1][0] + map[c[i - 1]][c[i]];
for(j = 1 ; j <= m ; j ++ )
{
f[i][j] = min(f[i - 1][j] + map[c[i - 1]][c[i]] ,
g[i - 1][j] + map[c[i - 1]][c[i]] * (1 - p[i - 1])
+ map[d[i - 1]][c[i]] * p[i - 1]);
g[i][j] = min(f[i - 1][j - 1] + map[c[i - 1]][c[i]] * (1 - p[i])
+ map[c[i - 1]][d[i]] * p[i] ,
g[i - 1][j - 1] + map[c[i - 1]][c[i]] * (1 - p[i - 1]) * (1 - p[i])
+ map[d[i - 1]][c[i]] * p[i - 1] * (1 - p[i])
+ map[c[i - 1]][d[i]] * (1 - p[i - 1]) * p[i]
+ map[d[i - 1]][d[i]] * p[i - 1] * p[i]);
}
}
for(i = 0 ; i <= m ; i ++ )
ans = min(ans , min(f[n][i] , g[n][i]));
printf("%.2lf\n" , ans);
return 0;
}
【bzoj4720】[NOIP2016]换教室的更多相关文章
- bzoj4720: [Noip2016]换教室(期望dp)
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1294 Solved: 698[Submit][Status ...
- BZOJ4720 [Noip2016]换教室
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 2018.08.30 bzoj4720: [Noip2016]换教室(期望dp)
传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...
- [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 ...
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- 【bzoj4720】[NOIP2016]换教室 期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
随机推荐
- 某中国500强企业BI系统成功应用案例
随着某集团20多年的不断发展发展,现已成为中国500强.中国大企业集团竞争力前25强.中国信息化标杆企业和国家重点火炬高新技术企业.拥有总资产数十亿元.员工数万名,涉足电力.家电.能源.等多个行业,并 ...
- Android(Linux)控制GPIO的方法及实时性分析
Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...
- mysql集群数据一致性校验
目前,mysql在互联网行业使用地如火如荼,很多大型网站都在使用MySQL数据库,通过搭建mysql主备集群,实现高性能,高可用的存储方案.mysql集群的共同特性是通过复制来实现主备间的同步,保证主 ...
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- 通过OnResultExecuted设置返回内容为JSONP
public class JsonpAttribute : ActionFilterAttribute { /// <summary> /// 在执行操作结果后更改返回结果 /// < ...
- Python学习笔记 之 函数
函数 函数式编程最重要的是增强代码的重用性和可读性 定义和使用 def 函数名(参数): ... 函数体 ... 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日 ...
- spoj 371 Boxes
N个盒子围成一圈,第i个盒子初始时有Ai个小球,每次可以把一个小球从一个盒子移到相邻的两个盒子之一里.问最少移动多少次使得每个盒子中小球的个数不超过1. ΣAi<=N.1<=N<=1 ...
- hadoop在网页客户端的maven配置
hadoop网页客户端maven配置,只能在tomcat7上运行,tomcat6和tomcat8运行会出错,我用的是tomcat-7.0.67 完整的pom.xml内容为: <!-- 这个配置只 ...
- Objective-C总Runtime的那点事儿(一)消息机制
最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等.其他的问题 ...
- oracle---触发器总结
一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需 ...