[编程题]饥饿的小易

小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。

输入描述:
输入一个初始位置x_0,范围在1到1,000,000,006
输出描述:
输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1
输入例子:
125000000
输出例子:
1

算法思想:用哈希表存储已访问的点,使用队列存储待访问的点,bfs广度优先遍历
 1 import java.util.HashMap;
 2 import java.util.LinkedList;
 3 import java.util.Map;
 4 import java.util.Queue;
 5 import java.util.Scanner;
 6
 7 public class Test23 {
 8     final static long MOD = 1000000007L;
 9     final static int MAX = 100000;
10
11     public static void main(String[] args) {
12
13         Scanner in = new Scanner(System.in);
14         while (in.hasNextLong()) {
15             long x = in.nextLong();
16             System.out.println(count(x));
17         }
18     }
19
20     private static long count(long x) {
21         Map<Long, Integer> dist = new HashMap<Long, Integer>();//用哈希表存储已访问的点
22         Queue<Long> queue = new LinkedList<Long>();//使用队列存储待访问的点,bfs广度优先遍历
23         dist.put(x, 0);
24         queue.add(x);
25         while (!queue.isEmpty()) {
26             long d;
27             Long top = queue.poll();
28             if (dist.get(top) > MAX)
29                 break;
30             if (top == 0) {
31                 return dist.get(top);
32             }
33             d = ((top << 2) + 3) % MOD;
34             if (d == 0) {
35                 return dist.get(top) + 1;
36             }
37             if (!dist.containsKey(d)) {
38                 queue.add(d);
39                 dist.put(d, dist.get(top) + 1);
40             }
41             d = ((top << 3) + 7) % MOD;
42             if (d == 0) {
43                 return dist.get(top) + 1;
44             }
45             if (!dist.containsKey(d)) {
46                 queue.add(d);
47                 dist.put(d, dist.get(top) + 1);
48             }
49         }
50         return -1L;
51     }
52
53 }
				
时间: 2024-11-10 14:59:51

[编程题]饥饿的小易的相关文章

[编程题] 独立的小易 网易2018

小易为了向他的父母表现他已经长大独立了,他决定搬出去自己居住一段时间.一个人生活增加了许多花费: 小易每天必须吃一个水果并且需要每天支付x元的房屋租金.当前小易手中已经有f个水果和d元钱,小易也能去商店购买一些水果,商店每个水果售卖p元.小易为了表现他独立生活的能力,希望能独立生活的时间越长越好,小易希望你来帮他计算一下他最多能独立生活多少天. 输入描述: 输入包括一行,四个整数x, f, d, p(1 ≤ x,f,d,p ≤ 2 * 10^9),以空格分割 输出描述: 输出一个整数, 表示小易

python 饥饿的小易(网易笔试题)

本周早些时候,学弟给我发了一道网易的笔试题,饥饿的小易,感觉有点意思-分享给大家 题目描述: 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者c.因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次.贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等).小易需要你帮忙计算最少需要

饥饿的小易(枚举+广度优先遍历(BFS))

题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次.贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等).小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳. 输入描述: 输入一个初始位置x_0

校招真题练习027 小易的字典(网易)

小易的字典 题目描述小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目.小易的这个字典很奇特, 字典内的每个单词都包含n个'a'和m个'z', 并且所有单词按照字典序排列.小易现在希望你能帮他找出第k个单词是什么. 输入描述:输入包括一行三个整数n, m, k(1 <= n, m <= 100, 1 <= k <= 109), 以空格分割. 输出描述:输出第k个字典中的字符串,如果无解,输出-1. 1 def Cnm(a, b): 2 ans =1 3 for

牛客网编程练习之解救小易

思路: 如果使用遍历的话需要遍历每一个点然后再比较,这样也许可以通过一些样例,但是很容易就是TLE了,所以应该还有更好的办法. 走格子这种问题,如果不能斜着走的话,那么从(1, 1)走到任意一个位置(x, y)都需要在x轴走上(x-1)步,在y轴走上(y-1)步,加起来就是x+y-2步,所以这道题就变成了简单的比大小. AC代码: import java.util.Scanner; /** * @author CC11001100 */ public class Main { public st

[编程题]小易喜欢的单词

小易喜欢的单词具有以下特性:1.单词每个字母都是大写字母2.单词没有连续相等的字母3.单词没有形如"xyxy"(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续.例如:小易不喜欢"ABBA",因为这里有两个连续的'B'小易不喜欢"THETXH",因为这里包含子序列"THTH"小易不喜欢"ABACADA",因为这里包含子序列"AAAA"小易喜欢"A"

编程题:指针变量作函数参数,将两个整数按由大到小的顺序输出。

分析:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值. #include<stdio.h> void swap(int *p1,int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } void main() { int a=3,b=4; int *ptr1,*ptr2; ptr1=&a;ptr2=&b; if(a<b) swap(ptr1,ptr2); printf("%d,%d\n",

寒假作业2——Pintia小作业及编程题

编程题(电梯) Click to Github 听华一大大说可以用回溯算法,熟练运用搜索引擎的我就百度了一下,琢磨了很多天以为自己会了,真的看到题目还是一脸懵逼(#`-_ゝ-),提交的代码并没有用到回溯(因为不会),而且只能处理几组非常特殊的数据,但是担心截止时间前改不完就先提交了. 我的想法 -将五组数据按照请求时间进行排序 -根据时间顺序载客并作出选择 1.送完电梯内的乘客再去载其他发出请求的乘客 2.在送该乘客的过程中接其他乘客 (1)接的乘客恰好目的地与电梯上的乘客相同,即"顺风车&qu

网易2017春招笔试真题编程题集合(10)——小易记单词

小易参与了一个记单词的小游戏.游戏开始系统提供了m个不同的单词,小易记忆一段时间之后需要在纸上写出他记住的单词.小易一共写出了n个他能记住的单词,如果小易写出的单词是在系统提供的,将获得这个单词长度的平方的分数.注意小易写出的单词可能重复,但是对于每个正确的单词只能计分一次. 输入描述: 输入数据包括三行: 第一行为两个整数n(1 ≤ n ≤ 50)和m(1 ≤ m ≤ 50).以空格分隔 第二行为n个字符串,表示小易能记住的单词,以空格分隔,每个单词的长度小于等于50. 第三行为m个字符串,系