题目如下:

这道题难点不仅在于正确理解题意,判断递归条件,更在于用数学方法推出解决公式。因为N最大为1百万,而内存只有256MB, 所以暴力递归肯定会超时,超空间。

不过,我才疏学浅,又没有大量时间去深究,所以只写出了暴力递归算法。进一步优化的话,可以考虑P在迭代很久后会变为0这一事实,也许可以进一步节省时空消耗。

下面给出算法,由于我注释写的很详细,这里就不进一步解释了。

 import java.util.Scanner;
public class Main { static int P;
static int Q;
static int N; static double result = 0; /**
*
* @param num 当前获得宝物个数,初始化为0
* @param arrayProb 保存每次路径参数
* @param prob 当前路径成功概率,初始化为0
* @param pathLen 当前路径长度,初始化为0
* @param p 初始成功概率,初始化为P
*/
public static void getPath(int num,int[] arrayProb ,int prob, int pathLen, int p){
if (num < N)
{
//首先递归左子树,也就是成功路径子树,成功只有三种情况
if (prob >= 100){
arrayProb[pathLen] = 100;
getPath(num+1, arrayProb, 0, pathLen+1, (int)(p/Math.pow(2,num+1)));
}else if(prob > 0){
arrayProb[pathLen] = prob;
getPath(num+1,arrayProb,0, pathLen+1, (int)(p/Math.pow(2,num+1)));
} else if (p > 0){
arrayProb[pathLen] = p;
getPath(num+1, arrayProb, 0, pathLen+1, (int)(p/Math.pow(2,num+1)));
} //再遍历同层右子树,也就是失败路径概率。prob<100,才有失败可能。
if (prob < 100 && p < 100) {
int tmp;
if(prob == 0){//只有第一次或者成功后prob才会为0
tmp = 100 - p;
prob = p;
}else {
tmp = 100 - prob;
}
arrayProb[pathLen] = tmp;
getPath(num, arrayProb, prob + Q, pathLen + 1,p);
}
} else{
double tmp = 1;
for (int i = 0; i < pathLen; i++) {
tmp *= 0.01 * arrayProb[i];
System.out.printf(arrayProb[i] + " ");
}
System.out.println();
tmp *= pathLen;
result += tmp;
}
} public static void main(String[] args) {
// write your code here
int[] array = new int[100000];
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
result = 0;
P = scanner.nextInt();
Q = scanner.nextInt();
N = scanner.nextInt();
getPath(0,array,0,0,P);
System.out.printf("%.2f", result);
}
}
}

Legendary Items-微软实习生笔试第一题的更多相关文章

  1. 金山网络2014春季Android实习生招聘-成都站-笔试第一题

    实现单例模式,并实现方法int getResult(float a),将a*8后返回. package jinshanwangluo.exam; /** * @author guoxm * @date ...

  2. 电子数字 网易游戏在线笔试 第一题 hihocoder

    题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1 这个题目有几个算法考点: (1)对于一个LED数码管(由7个发光二极管封装在一 ...

  3. hihocoder #1289 : 403 Forbidden (2016 微软编程笔试第二题)

    #1289 : 403 Forbidden 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi runs a web server. Sometimes ...

  4. 18年今日头条笔试第一题题解:球迷(fans)

    其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...

  5. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  6. hihocoder1489 Legendary Items 概率期望

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

  7. DP - tencent2016实习生笔试A

    tencent2016实习生笔试A Problem's Link ------------------------------------------------------------------- ...

  8. 网易实习笔试真题C/C++

    刚做的时候根本就没有想到解题思路,刚好看到了别人的思路,自己写了一下.里面对unordered_map及vector二维数组的建立很灵活,另外区别了一下map,unordered_map,hash_m ...

  9. 美团点评2017校招笔试真题-算法工程师A

    美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下 ...

随机推荐

  1. 在Express的页面模板中的变量的定义与使用总结

    前言 最近在使用Express框架中的ejs页面模板趟了些许坑,仅以本文记录总结. 本文简述的均为ejs页面模板. 创建ejs变量的各种方法 1. 在Nodejs定义的ejs变量 ejs由是在node ...

  2. 5_jQuery选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/stric ...

  3. android学习3——长宽的单位问题dp,px,dpi

    android设备的单位px,pt,dp,sp 分辨率 先通俗说下分辨率的概念.可以把屏幕想想成一个个正方形格子组成的.如果横向有1280个格子,竖向有720个格子.那么分辨率就是1280*720.这 ...

  4. Redis服务器搭建

    下载并解压redis,然后进入redis所在目录   编译安装             make && make install   启动redis 服务 (加上&表示在后台运 ...

  5. BI数据分析中KPI,KGI,CSF概念

    1. 行为产生数据 先来谈一谈,自己对数据基础概念的思考.我认为首先要建立的核心观点是:行为产生数据. 翻译一下这个核心观点.意思就是,当我们在思考或描述数据相关需求的时候,必然要包含这样的语素:&q ...

  6. angular : ng-options

    基本调用,得到name 属性 <select ng-model="target" ng-options="obj.name as obj.name for obj ...

  7. NSTimer定时器进阶——详细介绍,循环引用分析与解决

    引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...

  8. mysql like 多条

    例如: 有一张表,表中有字段,id ,name ,想模糊查询出表里name 包含 "张三“或者”李四“ 的值 select name from user where ( name like ...

  9. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

  10. ThinkPhp框架的数据库操作(查询)

    TP框架有一套自己的数据库操作的代码,包括数据库的增.删.改.查.本文主要讲解TP框架的数据库查询操作. 找到入口文件的控制器: 我这里的入口文件是Show文件夹下的控制器. 打开Login控制器. ...