【CodeM初赛B轮】F 期望DP
【CodeM初赛B轮】F
题目大意:有n个景点,m条无向边,经过每条边的时间需要的时间是li,在第i个景点游览花费的时间是ti,游览完第i个景点可以获得的满意度是hi。你的总时间为k,起初你等概率的选择游览一个景点,然后每次等概率的前往一个相邻的景点游览,当你剩余时间不够游览一个相邻的景点时就结束游览。问所获得的满意度的期望值。(本题强行询问两次~)
n<=100,总时间<=500
题解:显然的期望DP啊,不过本题的细节比较多,我这里只说一些细节吧~
用f[i][j]表示游览完景点i,还剩时间j,所获得的期望满意度。显然f[i][j]可以由相邻的景点转移而来,不过可没那么简单~
你还需要维护p[i][j]表示游览完景点i,还剩时间j,这种情况发生的概率;d[i][j]表示游览完景点i,还剩时间j,此时景点i的出度(显然,一个点的出度在不同时间是不一样的。)现在你才能进行状态转移。
$f[i][k]=\sum {f[j][k+l[i][j]+t[i]]\over d[j][k+l[i][j]+t[i]]}+h[i]*p[i][k]$
答案就是所有出度为0的状态的f之和(显然它们的p之和=1,如果你的程序正确的话~)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef long double ld;
int n,m,T;
int map[110][110],t[110],h1[110],h2[110],d[110][500];
ld ans,ans1,ans2,p[110][500],f1[110][500],f2[110][500];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),T=rd();
int i,j,k,a,b,c,flag;
for(i=1;i<=n;i++) t[i]=rd(),h1[i]=rd(),h2[i]=rd();
for(i=1;i<=m;i++) a=rd(),b=rd(),map[a][b]=map[b][a]=rd();
for(i=1;i<=n;i++) p[i][T-t[i]]=1.0/n;
for(k=T-1;k>=0;k--)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) if(map[i][j]&&k>=map[i][j]+t[j]) d[i][k]++;
for(j=1;j<=n;j++)
{
if(!map[i][j]) continue;
c=k+map[i][j]+t[i];
if(c>=T) continue;
p[i][k]+=p[j][c]/d[j][c];
f1[i][k]+=f1[j][c]/d[j][c];
f2[i][k]+=f2[j][c]/d[j][c];
}
f1[i][k]+=p[i][k]*h1[i];
f2[i][k]+=p[i][k]*h2[i];
if(!d[i][k]) ans+=p[i][k],ans1+=f1[i][k],ans2+=f2[i][k];
}
}
printf("%.5lf %.5lf",(double)ans1,(double)ans2);
return 0;
}
【CodeM初赛B轮】F 期望DP的更多相关文章
- 【CodeM初赛B轮】A 贪心
[CodeM初赛B轮]A 题目大意:给你一棵树,起初所有点都是白色的,你每次都能选择一个白点i,将这个点i到根路径上的所有到i的距离<k[i]的点都染成黑色(根和i也算,已经被染成黑色的点还是黑 ...
- loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp
题意:有一个栈,随机插入 $n$ 次 $0$/$1$ 如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶. 求:$n$ 次操作后栈中期望的元素个数. 我们发现,按照上述弹栈方式 ...
- CodeM初赛B轮
做什么啊,我这么菜,应该弃赛的 [编程|1500分] 子串 时间限制:3秒空间限制:32768K 题目描述 给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16) ...
- 美团CodeM初赛B轮 合并字符串的价值 (线段树,分类讨论)
输入两个字符串a和b,合并成一个串c,属于a或b的字符在c中顺序保持不变.如"ACG"和"UT"可以被组合成"AUCTG"或"AC ...
- 【CodeM初赛A轮】D 分解质因数+暴力
题目描述树链是指树里的一条路径.美团外卖的形象代言人袋鼠先生最近在研究一个特殊的最长树链问题.现在树中的每个点都有一个正整数值,他想在树中找出最长的树链,使得这条树链上所有对应点的值的最大公约数大于1 ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- 美团2018年CodeM大赛-初赛B轮 B 配送(最短路)
美团2018年CodeM大赛-初赛B轮 B 配送 题意 题解 对于每个任务,只要从上个任务的终点出发即可. 时间.地点很少,可以算出每个地点-时间的最小花费. 以题目描述的起点终点起始结束时间建图,很 ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
随机推荐
- 自己定义控件-LinearListView
一.描写叙述 用LinearLayout 实现的一个ListView ,重写了ListView中的经常使用函数,所以使用起来和ListView 没有区别. 比方:setAdapter.addHeade ...
- ant 报 make sure you have it in your classpath
检查build.xml的配置 build.xml配置出错,导致的这个问题
- P6 EPPM 安装和配置指南
In This Section Installation and Configuration Guide Manual Installation Guides P6 Professional Inst ...
- iOS---sha1加密的一个坑
OC语言写的sha1加密算法,在网上随手能够搜索到(例如以下便是),可是我不得不说有一些人不责任,没有提醒大家导入必要的系统头文件.从而导致错误 + (NSString *) sha1:(NSStri ...
- Node.js node主文件找不到时报出的Error:Cannot find module异常
如果执行>Node xx.js时,xx,js找不到的话,报出的错误是Error:Cannot find module 'c:/test/xx,js' 主文件名打错或者是点号打成逗号都会出这样的错 ...
- JNI 函数注册与管理
class<--> 一一对应so-->method 每个so对应于一个类对象 类中的每个native方法对应 于so中的一个native的function,对应关系涉及 {c ...
- ionic准备之angular基础——继承(3)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python_Select解析
selcet(等待I/O完成)的介绍: select同时监控多个socket,select()的机制提供了fd_set的数据结构,实际是long类型的数组,优点是跨平台性,select的缺点在于单个进 ...
- 怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法
怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法 Windows10系统的"快速访问"功能很容易泄露电脑中的隐私,用什么方法可以让这个功能消失,避免电脑的个人 ...
- 关于XSuperMES项目使用的PDF框架
我在曾经的项目中使用的是pdfbox.在读取中文文档时能够读出大部分的文字,可是在数字.分页等地方还是不可避免的出现乱码. 于是我在网上搜索,看有没有什么解决方法.看到有说法: "PDFBo ...