http://hihocoder.com/problemset/problem/1489


笔试题第一道,虽然说第一道都很水,但是我感觉这题不算特别水把。。这道题我就卡住了我记得,tle,最后只有30分,比较惨烈。我个人感觉这道题正解比较难想把,那时候太年轻,没有想到当item很大时,可以从第八道item开始就把初始p当成0来计算。。不过我试了一下,发现即使如此,还要计算每次的数学期望,反正我当时要是不知道,Ei和Ei+1之间的联系,应该还是算不出来。。我太麻瓜了。。

贴一下我tle代码,思路就是dfs这个概率树。。非常完美可惜不行。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std; double startp,q;
int n;
double getsum(int all,int num,double p,double sum)
{
double left,right;
if(num==n) return sum*all;
if(p>=)
{
right=;
double nextp;
if(num>=) nextp=;
else nextp=startp/(<<(num+));
left=getsum(all+,num+,nextp,sum);
}
else if(p==)
{
left=;
right=getsum(all+,num,q,sum);
}
else
{
right=getsum(all+,num,p+q,sum*(-p));
double nextp;
if(num>=) nextp=;
else nextp=startp/(<<(num+));
left=getsum(all+,num+,nextp,sum*p);
}
return left +right;
}
int main()
{
double res;
scanf("%lf %lf %d",&startp,&q,&n);
startp/=;
q/=;
res=getsum(,,startp,);
printf("%.2lf\n",res);
return ;
}

这题很关键的一点的就是,就是不同个数的期望是可以相加的。这个地方我一直很不明白,非常困惑,哇,要是我知道是这样,就直接相加了啊,谁还写dfs啊。。

http://www.mamicode.com/info-detail-1759090.html这个我看了这个博主给的解释:

其实我们发现图中那两个标号 1 的节点子树是一样的,它们获取下一个物品的情况和期望都是一样的。我本来在考虑不同情况下拿到第一个,开始拿第二个,第二个和第一个是不是独立的?但是其实所有情况下拿到第一个的概率总和是1,所以无论 dfs 的哪一个分支,最后都会到同一个初始概率去获取第二个,所以获取第二个的期望与第一个是独立可加的。

我比较愚钝,还是不能非常理解。。相互独立的话,可是题意中给的式子是

2*50%*25% + 3*50%*75%*100% + 3*50%*100%*25% + 4*50%*100%*75%*100% = 3.25

意思是每个都是和做掉的任务个数是相关的,并且是累加的。。就是完成了1件传说后,已经完成了2个任务,然后下次就要从3开始算,并且概率还要相乘。。算的话看起来好像不是直接相加就好了。。当然博主说的很好也是对的。。只是我乍一看并不是非常理解。。

http://blog.csdn.net/sddyzjh/article/details/68950610还有这个博主,

那么期望的计算式可以写成Ei=Σpk∗lk,其中pk表示做了lk个任务后拿到i个奖励的概率 
用Pi表示⌊P2i⌋% 
接着考虑Ei+1=Σp′k∗l′k 
=Pi+1∗Σpk∗(lk+1) 
+(1−Pi+1)∗(Pi+1+Q%)∗Σpk∗(lk+2) 
+(1−Pi+1)∗(1−Pi+1−Q%)∗(Pi+1+2Q%)∗Σpk∗(lk+3)+... 
直到Pi+1+kQ%超过1结束 
于是用ci=Σpk 
Ei+1=Σp′k∗l′k 
=Pi+1∗(Ei+ci) 
+(1−Pi+1)∗(Pi+1+Q%)∗(Ei+2ci) 
+(1−Pi+1)∗(1−Pi+1−Q%)∗(Pi+1+2Q%)∗(Ei+3ci)+...

直接用算的,求出Ei+1和Ei的关系,答案就很明显了。看了式子之后,发觉写的很好,很容易理解。应该可以根据这个规律直接code,博主给的代码也蛮好理解的。

其实有一个很明显的地方值得注意。其实我们可以发现Ei=Σpk∗lk跟概率论的数学期望很相似啊。这道题其实就是让我们求数学期望,我之前一直不知道在想什么,把绕来绕去。。我们可以发现Ei是绝对收敛的呀。要是k无限大,就是完成的任务无限多的时候,概率是趋于1的呀讲道理啊,就是完成任务无限多,不是肯定要完成传说任务的。

数学期望其实就是一个加权平均意思,这道题中的意思就是当给定了n,即要完成n个传说任务,加权平均一下,数学期望在这里表示的就是要完成平均多少个任务才能完成n个传说任务。数学期望在物理上就是一堆质点的重心,也就是加权平均。两个铁块已知重心的话,把他们重叠起来,在坐标轴上新的重心不就是两个重心的中点嘛,所以是可以直接相加的。

设C为一个常数,X和Y是两个随机变量。以下是数学期望的重要性质:
1.E(C)=C
2.E(CX)=CE(X)
3.E(X+Y)=E(X)+E(Y)
4.当X和Y相互独立时,E(XY)=E(X)E(Y)
性质3和性质4可以推到到任意有限个相互独立的随机变量之和或之积的情况。
上面是数学期望的性质,是可以直接相加的两个期望。所以这道题也不难理解了。
这是数学期望期望E(X+Y)=E(X)+E(Y) 就是这道题的精髓,很特别,我开始不知道这个,就被dfs套牢了。。唉。悲伤的故事。。 数学果然是算法的灵魂。。好好学习。。天天向上。。
贴一下别人ac代码。。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std; const int maxn=1e6+;
const int INF=0x3f3f3f3f;
double ans=;
double num[] = {};
int n,p,q; int main()
{
scanf("%d%d%d",&p,&q,&n);
for(int pre = ; pre <= ; ++ pre )
{
int cnt = ;
double p1 = ;
while()
{
double xq = ( pre + cnt * q) / 100.0;
if( pre + cnt * q >= )
{
num[pre] += ( cnt + ) * p1 ;
break;
}
num[pre] += p1 * xq * ( cnt + );
p1 *= ( - xq );
cnt++;
}
} int pre = p;
for(int i = ; i <= n ; ++ i )
{
if( pre == )
{
ans += ( n - i + ) * num[];
break;
}
ans += num[pre];
pre >>= ;
} printf("%.2lf\n",ans);
return ;
}

hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)的更多相关文章

  1. 微软2017年预科生计划在线编程笔试 A Legendary Items

    思路: 获得第i(i = 0, 1, ..., n - 1)件物品的概率仅由公式p / (1 << i)决定,所以获得这i件物品之间是相互独立的.迭代计算获得所有i件物品的期望再求和即可. ...

  2. 【微软2017年预科生计划在线编程笔试 A】Legendary Items

    [题目链接]:https://hihocoder.com/problemset/problem/1489 [题意] 每轮游戏; 你一开始有p的概率获得超神标记; 如果这轮游戏你没获得超神标记; 那么你 ...

  3. 【微软2017年预科生计划在线编程笔试 B】Tree Restoration

    [题目链接]:https://hihocoder.com/problemset/problem/1490 [题意] 给你一棵树的以下信息: 1.节点个数 2.给出树的每一层从左到右的顺序每个节点的编号 ...

  4. 【微软2017年预科生计划在线编程笔试第二场 B】Diligent Robots

    [题目链接]:http://hihocoder.com/problemset/problem/1498 [题意] 一开始你有1个机器人; 你有n个工作; 每个工作都需要一个机器人花1小时完成; 然后每 ...

  5. 【微软2017年预科生计划在线编程笔试第二场 A】Queen Attack

    [题目链接]:http://hihocoder.com/problemset/problem/1497 [题意] 给你n个皇后; 然后问你其中能够互相攻击到的皇后的对数; 皇后的攻击可以穿透; [题解 ...

  6. Queen Attack -- 微软2017年预科生计划在线编程笔试第二场

    #!/usr/bin/env python # coding:utf-8 # Queen Attack # https://hihocoder.com/problemset/problem/1497 ...

  7. hihocoder1489 Legendary Items 概率期望

    Little Hi is playing a video game. Each time he accomplishes a quest in the game, Little Hi has a ch ...

  8. 2015-微软预科生计划-面试题-Swimming Plans

    http://hihocoder.com/problemset/problem/1188 题目大意 Steven在时刻T到达了室内游泳池. 游泳池一共有N条泳道,游泳池两侧分别标记为0和1. 已知除了 ...

  9. hihocoder 1489(微软2017, 数学,模拟)

    题目链接:http://hihocoder.com/problemset/problem/1489?sid=1587434 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...

随机推荐

  1. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  2. MAC 文件被锁定

    从windows拷贝到MAC的文件,有时候会被锁定.右键-简介-已锁定也是灰色的,无法取消: xattr -l 文件名 xattr -d com.apple.FinderInfo 文件名

  3. php 面试指南

    https://xianyunyh.gitbooks.io/php-interview/

  4. C语言 五子棋2

    #include<windows.h> #include<stdlib.h> #include<stdio.h> #include<conio.h> # ...

  5. Hilite代码高亮工具

    在用<有道云笔记>等软件时候,软件自身不提供代码高亮功能,对于需要记录code的学习笔记,视觉效果丢失. 有很多在线工具能用来代码高亮,比如oschina就有代码高亮页面用于着色. 但是我 ...

  6. Hadoop(七)YARN的资源调度

    一.YARN 概述 YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操 作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序 YARN ...

  7. 搭建 GIT 服务器

    Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 git 服务器. 安装依赖库和编译工具 为了后续安装能 ...

  8. 第六章:加载或保存JSON数据

    加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...

  9. Java8所有的包介绍(由英文文档翻译而来)

    转载: Java8所有的包介绍(由英文文档翻译而来)

  10. 【转载】Picasso源码解析

    原文地址:http://blog.csdn.net/u012702547/article/details/52273918 Picasso是Squareup公司出的一款图片加载框架,能够解决我们在An ...