UOJ262 【NOIP2016】换教室
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
Description
Input
Output
Sample Input
2 1 2
1 2 1
0.8 0.2 0.5
1 2 5
1 3 3
2 3 1
Sample Output
24分
注意到有6个测试点m=0,则说明不能提出申请,那么只需要求出全图的两两之间的最短路,路径唯一确定。
52分
注意到另外有7个测试点m=1,只能提出一次申请。我们可以直接枚举在哪里提出申请,再与不申请的时候取一个min就可以了。
76分
注意到还有6个测试点m=2,只能提出两次申请,暴力枚举哪两个点申请即可。
80分
其实我们并不需要分那么多类情况讨论,考虑直接爆搜,在每个点是否提出申请,最后暴力计算贡献。因为这样的复杂度是C(n,m)的,所以m<=2和n<=10是完全没有问题的,直接可以用搜索拿到80分。
100分
这显然是一道概率DP裸题。考虑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-p[i-1])+dis(d[i-1],c[i])*p[i-1] )}$$
$${f[i][j][1]=min( f[i-1][j-1][0]+dis(c[i-1],d[i])*p[i]+dis(c[i-1],c[i])*(1-p[i]),f[i-1][j-1][1]+dis(c[i-1],c[i])*(1-p[i-1])*(1-p[i])+dis(c[i-1],d[i])*(1-p[i-1])*p[i]+dis(d[i-1],c[i])*p[i-1]*(1-p[i]))+dis(d[i-1],d[i])*p[i-1]*p[i]) }$$
(dis(i,j)表示i到j的最短距离)
需要说明的是,期望是可以线性相加的,也就是说一条路径上的距离总期望值实际上就等于每两个相邻点之间的距离的期望值的总和。另外上面的转移式可以这样理解:在我们已经提出申请的情况下,对于所有情况的讨论就是在现有的申请情况下的能得到的距离期望值,事实上是根据计算了每条边的贡献。
这样即可获得满分。时间复杂度:O(V3+nm)
注意事项
如果状态的0、1表示的是地点在c还是d的话会有不少问题,因为压根就不能体现出申请的时候的成功与失败结果,但是对于m<=2的点基本不会出错,大点的出错概率也不是特别大,就导致这样完全错误的状态设计在联赛数据下获得了88分……
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = ;
const int MAXD = ;
const int inf = (<<);
int n,m,D,bian,c[MAXN],d[MAXN],dis[MAXD][MAXD];
double f[MAXN][MAXN][],k[MAXN],ans; inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
} inline void work(){
n=getint(); m=getint(); D=getint(); bian=getint(); int x,y,z,lim; double minl;
for(int i=;i<=n;i++) c[i]=getint(); for(int i=;i<=n;i++) d[i]=getint(); for(int i=;i<=n;i++) scanf("%lf",&k[i]);
for(int i=;i<=D;i++) for(int j=;j<=D;j++) dis[i][j]=inf;
for(int i=;i<=bian;i++) {
x=getint(); y=getint(); z=getint(); if(dis[x][y]==inf) dis[x][y]=dis[y][x]=z;
else dis[x][y]=min(dis[x][y],z),dis[y][x]=dis[x][y];
}
for(int l=;l<=D;l++) for(int i=;i<=D;i++) if(i!=l) for(int j=;j<=D;j++) if(j!=l&&i!=j) dis[i][j]=min(dis[i][l]+dis[l][j],dis[i][j]);
for(int i=;i<=n;i++) for(int j=;j<=m;j++) f[i][j][]=f[i][j][]=1e30; f[][][]=f[][][]=;
for(int i=;i<=D;i++) dis[i][i]=;
for(int i=;i<=n;i++) {
lim=min(i,m);
for(int j=;j<=lim;j++) {
minl=f[i-][j][]+dis[c[i-]][c[i]]*(1.0-k[i-])+dis[d[i-]][c[i]]*k[i-];
minl=min(minl,f[i-][j][]+dis[c[i-]][c[i]]);
f[i][j][]=min(f[i][j][],minl);
if(j>=) {
minl=f[i-][j-][]+dis[c[i-]][c[i]]*(1.0-k[i])*(1.0-k[i-])+dis[c[i-]][d[i]]*(1.0-k[i-])*k[i];
minl+=dis[d[i-]][c[i]]*k[i-]*(-k[i])+dis[d[i-]][d[i]]*k[i-]*k[i];
minl=min(minl,f[i-][j-][]+dis[c[i-]][d[i]]*k[i]+dis[c[i-]][c[i]]*(1.0-k[i]));
f[i][j][]=min(f[i][j][],minl);
}
}
}
ans=1e30; for(int i=;i<=m;i++) ans=min(ans,min(f[n][i][],f[n][i][]));
printf("%.2lf",ans);
} int main()
{
work();
return ;
}
UOJ262 【NOIP2016】换教室的更多相关文章
- [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 ...
- bzoj4720: [Noip2016]换教室(期望dp)
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1294 Solved: 698[Submit][Status ...
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- 【bzoj4720】[NOIP2016]换教室
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
- [NOIP2016]换教室(概率期望$DP$)
其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...
- 【bzoj4720】[NOIP2016]换教室 期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- NOIP2016换教室 BZOJ 4720
BZOJ 4720 换教室 题目描述: 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上 ...
随机推荐
- 重构Web Api程序(Api Controller和Entity)续篇
昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ...
- [转]分享php中四种webservice实现的简单架构方法及实例
FROM : http://www.itokit.com/2012/0417/73615_2.html 本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的P ...
- 获取iTextSharp 的image 报错
获取itextsharp类库的image对象的时候报错 outofmemory .经过艰苦的测试发现jpeg类型是可行的的 iTextSharp.text.Image je = iTextShar ...
- IntelliJ IDEA,代码行宽度超出限制时自动换行
转自:http://my.oschina.net/angerbaby/blog/471351 当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能 ...
- VR的UI、UX设计原则
国外其实有不少关于VR用户体验的研究 总结一下我所了解的: Cardboard Design Lab 1. 使用十字线(比较适用于移动VR.一体机) 2.有深度的UI与眼睛疲劳: 离眼睛近的UI,物体 ...
- Common Issues Which Cause Roles to Recycle
This section lists some of the common causes of deployment problems, and offers troubleshooting tips ...
- foreach 和 for 循环的区别
foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in Ge ...
- 服务链(Service Chaining,or Service Function Chaining,SFC,功能服务链)
Software-configured service chaining provides the capability to dynamically include best-of-b ...
- matlab画图形函数 semilogx
matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...
- SqlServer中——查找杀死阻塞进程
查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM ...