hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)
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)=C2.E(CX)=CE(X)3.E(X+Y)=E(X)+E(Y)4.当X和Y相互独立时,E(XY)=E(X)E(Y)性质3和性质4可以推到到任意有限个相互独立的随机变量之和或之积的情况。

#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年预科生计划在线编程笔试)的更多相关文章
- 微软2017年预科生计划在线编程笔试 A Legendary Items
思路: 获得第i(i = 0, 1, ..., n - 1)件物品的概率仅由公式p / (1 << i)决定,所以获得这i件物品之间是相互独立的.迭代计算获得所有i件物品的期望再求和即可. ...
- 【微软2017年预科生计划在线编程笔试 A】Legendary Items
[题目链接]:https://hihocoder.com/problemset/problem/1489 [题意] 每轮游戏; 你一开始有p的概率获得超神标记; 如果这轮游戏你没获得超神标记; 那么你 ...
- 【微软2017年预科生计划在线编程笔试 B】Tree Restoration
[题目链接]:https://hihocoder.com/problemset/problem/1490 [题意] 给你一棵树的以下信息: 1.节点个数 2.给出树的每一层从左到右的顺序每个节点的编号 ...
- 【微软2017年预科生计划在线编程笔试第二场 B】Diligent Robots
[题目链接]:http://hihocoder.com/problemset/problem/1498 [题意] 一开始你有1个机器人; 你有n个工作; 每个工作都需要一个机器人花1小时完成; 然后每 ...
- 【微软2017年预科生计划在线编程笔试第二场 A】Queen Attack
[题目链接]:http://hihocoder.com/problemset/problem/1497 [题意] 给你n个皇后; 然后问你其中能够互相攻击到的皇后的对数; 皇后的攻击可以穿透; [题解 ...
- Queen Attack -- 微软2017年预科生计划在线编程笔试第二场
#!/usr/bin/env python # coding:utf-8 # Queen Attack # https://hihocoder.com/problemset/problem/1497 ...
- hihocoder1489 Legendary Items 概率期望
Little Hi is playing a video game. Each time he accomplishes a quest in the game, Little Hi has a ch ...
- 2015-微软预科生计划-面试题-Swimming Plans
http://hihocoder.com/problemset/problem/1188 题目大意 Steven在时刻T到达了室内游泳池. 游泳池一共有N条泳道,游泳池两侧分别标记为0和1. 已知除了 ...
- hihocoder 1489(微软2017, 数学,模拟)
题目链接:http://hihocoder.com/problemset/problem/1489?sid=1587434 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...
随机推荐
- 高性能优秀的服务框架-dubbo介绍
先来了解一下这些年架构的变化,下面的故事是我编的.... "传统架构":很多年前,刚学完JavaWeb开发的我凭借一人之力就开发了一个网站,网站 所有的功能和应用都集中在一起,方便 ...
- flask插件系列之flask_caching缓存
前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...
- KKT条件和拉格朗日乘子法详解
\(\frac{以梦为马}{晨凫追风}\) 最优化问题的最优性条件,最优化问题的解的必要条件和充分条件 无约束问题的解的必要条件 \(f(x)\)在\(x\)处的梯度向量是0 有约束问题的最优性条件 ...
- jq用户评论点击回复简单代码。
类似这种镶套回复评论: <div> <ul> <!--一条评论 begin--> <li> <div class="user-colum ...
- js中的for循环
预定义: var arr=[22,33,12,34];//数组(特殊的对象) var obj={ //对象 name:"Jack", age:"99", sex ...
- day4 递归原理及解析
递归 递归是一种调用自身的方法,在函数执行过程中重复不断的调用自身的过程,递归的规模每次都要缩小,一般前一步的程序作为后一步的参数.但是必须有递归结束条件. 递归算法是一种直接或者间接地调用自身算法的 ...
- 飘窗原生js效果
css: .close { width: 30px; height: 20px; background: white; position: absolute; right: 0; top: 0; z- ...
- 20169211《Linux内核原理与分析》第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没 ...
- powershell 性能测试小脚本
powershell 性能测试: 转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 1. 将待测试的脚本封装在代码块中 2. 使用 Get-Ch ...
- UVA10298 Power Strings [KMP]
题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 ...