51nod1450 闯关游戏

题目来源: TopCoder

基准时间限制:1 秒 空间限制:131072 KB 分值: 320

一个游戏App由N个小游戏(关卡)构成,将其标记为0,1,2,..N-1。这些小游戏没有相互制约的性质,玩家可以任意时刻玩任意一个小游戏,且每个小游戏可以玩任意多次,一个小游戏玩一次消耗玩家恰好1min的时间。每个小游戏会根据玩家的表现返回3种结果:1)挑战失败;2)挑战成功并获得1颗星;3)挑战成功且获得2颗星。玩家可以多次挑战同一个小游戏,而且系统会记录玩家多次挑战中的最好成绩。(注意:两颗星优于一颗星优于挑战失败。)
这个游戏App通关需要同时满足2个条件:1)N个小游戏的系统记录的最好成绩都是成功;2)这N个小游戏的系统记录成绩中的星星总数至少是M颗。
根据一些统计,一个玩家在任一次玩第i个小游戏时,都会独立的发生以下结果:
* 有(1000 - X[i] - Y[i])*0.001的概率会挑战失败;
* 有   X[i]*0.001   的概率会挑战成功并获得一颗星;
* 有   Y[i]*0.001   的概率会挑战成功并获得两颗星.
其中1<=X[i],Y[i],且X[i]+Y[i]<=1000,且都为整数.
问一个玩家从安装完这个游戏App到这个游戏App通关,最优策略下需要花费时间的期望E。输出E的值,以min为该时间单位。(误差在1e-7内)

例如:样例中有两个小游戏,且两个小游戏每次玩必能通过,且有0.5的概率拿两颗星。玩家可以先各玩一个小游戏一次,有0.75的概率能拿至少3颗星;有0.25的概率只能拿2颗星,此时需要盯着一关不停的玩,直到得到两颗星,这需要1/2 * 1 + 1/4 * 2 + 1/8 * 3 + ... + 1/(2^k) * k + .... 次。所以,E = 0.75*2 + 0.25*(2 + 1/2 * 1 + 1/4 * 2 + 1/8 * 3 + ... + 1/(2^k) * k + .... )= 2.5。

Input

第一行两个个整数N,M,且1<=N<=2000,N <= M <= 2N
接下来N行,每行两个整数,X[i]、Y[i],其中1<=X[i],Y[i],且X[i]+Y[i]<=1000

Output

一个浮点数,即期望E。确保E的精度与正解的绝对误差或相对误差小于1e-7。

Input示例

2 3
500 500
500 500

Output示例

2.5

数学问题 期望DP

充满迷惑地过了一题。

根据多年的游戏经验,我们应该先过掉所有的关,然后挑两星概率最大的还没过的关使劲儿怼。

由此我们将关卡按Y排序,先决策Y大的。

设f[i][j]表示还有i关要打,还剩j颗星要拿。

然后愉快地转移。

注释掉的代码是第一次写的版本,看上去很有道理但是只能过一半的点,输出结果和答案比较像,但是精度达不到1e-7

实际运行的版本借鉴了隔壁sdfzyhx的思路,先将m-=n以保证每关必过。

但是这不科学啊,我觉得我的写法也能保证每关必过啊? 就很迷茫

挣扎了一个小时,放弃了思考。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 const int INF=0x3f3f3f3f;
 8 const int mxn=4005;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
13     return x*f;
14 }
15 int n,m;
16 double f[mxn][mxn];
17 struct node{
18     int x,y;
19     bool operator < (const node &b)const{
20         return y<b.y;
21     }
22 }a[mxn];
23 int main(){
24     int i,j;
25     n=read();m=read();
26     for(i=0;i<n;i++){
27         a[i].x=read();a[i].y=read();
28     }
29     m-=n;//
30     sort(a,a+n);
31     for(i=0;i<=n;i++)
32         for(j=0;j<=m;j++)
33             f[i][j]=INF;
34     f[n][m]=0;
35     for(i=n-1;i>=0;i--){
36         for(j=0;j<m;j++){
37             f[i][j]=min(f[i][j],
38                 1000.0/(a[i].x+a[i].y)+f[i+1][j]*a[i].x/(a[i].x+a[i].y)+
39                     f[i+1][j+1]*a[i].y/(a[i].x+a[i].y)
40             );
41             f[i][j]=min(f[i][j],f[i+1][j+1]+1000.0/a[i].y);
42         }
43         f[i][m]=min(f[i][m],1000.0/(a[i].x+a[i].y)+f[i+1][m]);
44     }
45     /*
46     for(i=n-1;i>=0;i--){
47         for(j=m;j>=0;j--){
48             f[i][j]=min(f[i][j],
49                     1000.0/(a[i].x+a[i].y)+f[i+1][j+1]*a[i].x/(a[i].x+a[i].y)+
50                         f[i+1][j+2]*a[i].y/(a[i].x+a[i].y));
51             f[i][j]=min(f[i][j],f[i+1][j+2]+1000.0/a[i].y);
52         }
53         f[i][0]=min(f[i][0],1000.0/(a[i].x+a[i].y)+f[i+1][0]);
54     }
55     */
56     printf("%.7f\n",f[0][0]);
57     return 0;
58 }
时间: 2024-10-05 04:25:55

51nod1450 闯关游戏的相关文章

网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞, 比如SQL注入攻击, XSS攻击. 本文将简述SQL注入攻击的原理, 并分享下关卡设计, 其在打开潘多拉魔盒的情况下, 又能很好地限制危害. 效果展示: 先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^). 本文的想法实施于第十一关--健忘的教授. 很直接的呈现一个登陆对话框, 考验玩家

网页闯关游戏(riddle webgame)--游戏玩法和整体介绍

前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想复制实现一个类似的网页闯关游戏. 说干就干, 抄起家伙, 就是一顿猛打, ^_^. 期间的坎坷曲折暂且不表, 甚至中途自觉江郎才尽差点放弃, 所幸最后终于完工, 愿意和大家一起分享该游戏. 展示: 网页闯关游戏, 更多的被称为riddle, 是一种考验搜索, 推理, 分析能力的闯关模式游戏. 用户群

网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信的聊天窗口界面, 以及其中涉及到的一些技术点. 作者前端是初学者, 请大拿们轻拍. 效果展示: 先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^) . 仿微信窗口的设计源于第四关--倾听女神的故事. 这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我个人感觉. 需求设定:

网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜欢这种方式. 你可能会很好奇, 它是如何实现的呢? 本文将阐述其原理, 并结合具体实例来演示如何借助H5的canvas来实现类刮刮卡的效果. 展示效果: 网页闯关游戏入口(请狠狠地点击我, ^_^) http://magic.mmxfgame.com. H5刮刮卡的实例源自第六关--拜访东方不败的故

射击闯关游戏,旧王已死、新王当立?

射击类游戏的最佳形态是电子竞技?比如<穿越火线> 街机.单机时代的<魂斗罗>.<合金装备>等闯关型射击游戏体验,不再适合移动手游时代? 射击类游戏需要更真实.更热血,最好如昆丁塔伦蒂洛的电影一样,拳拳到肉.血浆横飞?比如<使命召唤>? 曾经占据游戏机.单机和联机游戏极大份额的射击游戏们,在移动时代只能扮演有益补充? 射击类游戏混的似乎不太好?不是没有缘故的,根本原因就是长期自由搏击,而忘记了,其实关卡才是最能吸引用户的所在? 关卡.关卡.关卡!你还在自由搏击

《报任安书》文言文化常识闯关游戏

<报任安书>文言文化常识闯关游戏 原文地址:https://www.cnblogs.com/arbo/p/11192228.html

《报任安书》文言文化常识闯关游戏&#183;网络版

<报任安书>文言文化常识闯关游戏 暂时还是不行 原文地址:https://www.cnblogs.com/arbo/p/11192471.html

【原创】红客闯关游戏部分题解

工具: IE11.0 , CHROME 35.0.1916.114 m , DREAMWEAVER8.0 , MICROSOFT VISUAL STUDIO 2010 , www.cmd5.com MD5解密 ,tool.chinaz.com Unicode编码转换工具. 第0关: 1.IE打开页面,查看源.如果该页面中有跳转到下一关的入口,那么在源码中就有下一页面的URL.href 属性就是用于指定超链接目标的 URL.通过在源码中查找"href",定位到如下语句: <div

XSS闯关游戏准备阶段及XSS构造方法

请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上"外套"就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload payload指