Legendary Items-微软2017实习生笔试第一题

题目如下:

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

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

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

 1 import java.util.Scanner;
 2 public class Main {
 3
 4     static int P;
 5     static int Q;
 6     static int N;
 7
 8     static double result = 0;
 9
10     /**
11      *
12      * @param num   当前获得宝物个数,初始化为0
13      * @param arrayProb 保存每次路径参数
14      * @param prob    当前路径成功概率,初始化为0
15      * @param pathLen  当前路径长度,初始化为0
16      * @param p     初始成功概率,初始化为P
17      */
18     public static void getPath(int num,int[] arrayProb ,int prob, int pathLen, int p){
19         if (num < N)
20         {
21             //首先递归左子树,也就是成功路径子树,成功只有三种情况
22             if (prob >= 100){
23                 arrayProb[pathLen] = 100;
24                 getPath(num+1, arrayProb, 0, pathLen+1, (int)(p/Math.pow(2,num+1)));
25             }else if(prob > 0){
26                 arrayProb[pathLen] = prob;
27                 getPath(num+1,arrayProb,0, pathLen+1, (int)(p/Math.pow(2,num+1)));
28             } else if (p > 0){
29                 arrayProb[pathLen] = p;
30                 getPath(num+1, arrayProb, 0, pathLen+1, (int)(p/Math.pow(2,num+1)));
31             }
32
33             //再遍历同层右子树,也就是失败路径概率。prob<100,才有失败可能。
34             if (prob < 100 && p < 100) {
35                 int tmp;
36                 if(prob == 0){//只有第一次或者成功后prob才会为0
37                     tmp = 100 - p;
38                     prob = p;
39                 }else {
40                     tmp = 100 - prob;
41                 }
42                 arrayProb[pathLen] = tmp;
43                 getPath(num, arrayProb, prob + Q, pathLen + 1,p);
44             }
45         } else{
46             double tmp = 1;
47             for (int i = 0; i < pathLen; i++) {
48                 tmp *= 0.01 * arrayProb[i];
49                 System.out.printf(arrayProb[i] + " ");
50             }
51             System.out.println();
52             tmp *= pathLen;
53             result += tmp;
54         }
55     }
56
57     public static void main(String[] args) {
58     // write your code here
59         int[] array = new int[100000];
60         Scanner scanner = new Scanner(System.in);
61         while (scanner.hasNext()){
62             result = 0;
63             P = scanner.nextInt();
64             Q = scanner.nextInt();
65             N = scanner.nextInt();
66             getPath(0,array,0,0,P);
67             System.out.printf("%.2f", result);
68         }
69     }
70 }
时间: 2025-01-02 02:29:03

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

[京东2017实习生笔试] 通过考试

时间限制C/C++语言:1000MS其它语言:3000MS 内存限制C/C++语言:65536KB其它语言:589824KB 题目描述 小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试.考试结束后,小明估算出每题做对的概率,p1,p2,...,pn.你能帮他算出他通过考试的概率吗? 输入 输入第一行一个数n(1<=n<=100),表示题目的个数.第二行n个整数,p1,p2,...,pn.表示小明有pi%的概率做对第i题.(0<=pi<=100)

2016携程测试实习生笔试编程题

四道大题: 第一道题,是携程网站有一个725*286(具体不记得了)广告区域,能想到的测试类型及方法. 写测试用例——2016年1月1日到2016年3月1日同一订单往返机票立减50 全部功能点. 第二道题,sql语句.(该学sql- -) 第三道题,编程题: 有N个球,M个颜色(M小于等于N),求要想从这N个球里拿出全部(M)个颜色的球,至少需要拿多少个. 思路: 我又是用map实现的,当map的size==M的时候,就说明颜色已经集齐了,计算一个minNum,然后继续扫描,更新minNum 感

[京东2017实习生笔试] 终结者C

原题: http://exercise.acmcoder.com/online/online_judge_ques?ques_id=4401&konwledgeId=41 时间限制 C/C++语言:1000MS其它语言:3000MS 内存限制 C/C++语言:65536KB其它语言:589824KB 题目描述 收到情报,有批新造的机器人要运输到前线.小C将去破坏机器人的运输.小C将激光炮放置在公路的一旁,等运输车经过的时候发射(假设激光炮一定可以射穿车辆).由于能源有限,激光炮只能发射两次.可以

微软2016校招笔试 第一场部分题目个人思路

嗯--第一场当时还不知道报名,第二场报上了,拿了250/400,果然分如其人-- 这里包括的是第一场的ABC题,第二场的AB题的题解在另一篇(这些都是自己AC了的),第一场的D和第二场的C至今仍然在WA,不知道怎么回事,到时候也讲讲思路求指点吧. A. Magic Box 这道题并不难做,唯一需要注意的是cx,cy和cz,以及任意两个量的差之间是没有前后关系的(这个事情样例里也告诉你了),所以比较简单的方法就是先把cx,cy,cz排序,然后根据输入串一个一个模拟,然后计算出两两之间的差,排序,比

阿里巴巴2016笔试第一题 sql语句关键字匹配

阿里巴巴这道题和微软的笔试题比较类似,相对来讲更简单一些,可以将解决那道题的思路用在这道题上. /*题目简单描述: 根据给出的每个sql语句的执行时间,计算单个关键字的执行时间 *//* 样例输入:32.5 insert into tableA values(1,"columnA","columnB")12.5 insert into tableB values(2,"columnA","columnB","colu

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

1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下几个大类: 1. 顺序(序列)容器,有 vector,list,deque , string,stack( 适配器类), queue( 适配器类), priority queues( 适配器类). 2.关联容器,有set, multiset,map,multimap, bitset,hash_set, hash_map, hash_multi

阿里题目总结:——阿里巴巴2015实习生笔试真题

(1)编译和体系结构: 2 以下指令集架构属于复杂指令集架构的是? 正确答案: D   你的答案: D (正确) ARM MIPS SPARC 以上皆不是 解析: 常用的精简指令集: RISC 微处理器包括 DECAlpha . ARC . ARM . AVR . MIPS . PA-RISC . PowerArchitecture(包括 PowerPC) 和 SPARC 等. 复杂指令: CISC如X86 (2)十进制与二进制间的转换: 十进制整数转换为二进制整数采用"除2取余,逆序排列&qu

笔试真题 ALBB-2015 算法工程师实习生 笔试真题 解析

1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N!下3进制结果末尾有多少个0,其实就是计算3进制中的3被进位多少次,只要将N!因式分解成3^m*other,m就是答案.技巧性的解法就是m=N/3+N/(3^2)+N/(3^3)....+N(3^k) (k<=N/3) -- N=30:N/3+N/9+N/27=14. 2.小赵和小钱二人分别从寝室和图书馆同时出发,相向而行.过了一段时间后二人在中途相遇,小赵继续向图书馆前进

2015考研 杭电 计算机学院 复试笔试题第一题 JAVA语言解法

杭电 2015年考研 计算机学院 复试笔试第一题 JAVA解法 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 杭电2015年 计算机学院 复试 笔试题第一题 JAVA解答 * author 刘汪洋 QQ 605283073 * 求出:字符串如:"34223abd#34SB-11--" * 中整数的和 其中-在数字前表示负号,否则为字符 */ pub