游历魔法王国

2024-01-15 21:18
文章标签 魔法 王国 游历

本文主要是介绍游历魔法王国,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编程题

【题目描述】 魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。 小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。
输入描述:
输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。
第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。
输出描述:
输出一个整数,表示小易最多能游历的城市数量。

输入示例
5 2
0 1 2 3
输出示例
3

解题思路:

分析:

  1. 这道题中对于 p a r e n t [ i ] parent[i] parent[i]的取值范围做了限制为 0 ≤ p a r e n t [ i ] ≤ i 0 ≤ parent[i] ≤ i 0parent[i]i,因此在求树的最大高度的时候并不需要使用递归的方式去求,直接使用递推的方式去求最大深度。需要注意的是 p a r e n t [ i ] parent[i] parent[i]应该是节点 i + 1 i+1 i+1的父节点,因此求树高递推式为height[i + 1] = height[parent[i]] + 1,求出最大高度maxHeight
  2. 贪心法
  • L ≤ maxHeight ,结果为res = steps + 1
  • L > maxHeight ,意味着肯定需要往回走,并且树越短需要往回走的代价就越低。因此可以将走最高的那条路径的步数留下来,然后,剩下的富余的步数去走一些较短的树,最后去走最长的那颗树。 因此 res = 1 + maxHeight + (L - maxHeight) / 2; 当然最后访问的节点数肯定不能多于树中的节点数,因此: res = max(res, n)

C/C++版

/*Time: 2019-01-22     Author: snowy链接:https://www.nowcoder.com/questionTerminal/f58859adc39f4edc9cd8e40ba4160339	来源:牛客网【题目描述】魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。输入描述: 输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。输出描述:输出一个整数,表示小易最多能游历的城市数量。
* */
#include <iostream>
#include <algorithm>
using namespace std;int maxCityNum(int cityNum, int steps, int *parents)
{// 存储每个节点的高度int height[200];memset(height, 0, cityNum);// 首先需要求这棵树的最大高度int maxHeight = 0;for (int i = 0; i < cityNum - 1; i++){// 每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接height[i + 1] = height[parents[i]] + 1;		// 每个节点的高度等于父节点的高度+1,  parent[i] 当作是(i+1)节点的的父亲节点maxHeight = max(maxHeight, height[i + 1]);}/*// 如果最大高度大于steps,那么直接走最大高度那条路径,最终访问的节点为 steps + 1if (steps <= maxHeight)return steps + 1;// 否则的话就留下最大高度的哪条路径的步数,其他步数用于访问其他节点,但最终还是都要返回到去最大高度的那条路径上,因此剩余的步数需要除以2,表示这些路径需要返回else{int res = 1 + maxHeight + (steps - maxHeight) / 2;// 但是访问的节点数不能超过所有的节点数return min(res, cityNum);}*/// 上面的if-else代码优化一下等价于下面两行int d = min(steps, maxHeight);	// 求步数和最大高度中的较小的那个值,steps>maxHeight表示出了走maxHeight那条路径还要其他路径, steps<=maxHeight表示就走maxHeight哪条路径就可以了return min(cityNum, 1 + d + (steps - d) / 2);
}int main()
{int cityNum, steps;cin >> cityNum >> steps;int parent[200];for (int i = 0; i < cityNum - 1; i++){cin >> parent[i];}int res = maxCityNum(cityNum, steps, parent);cout << res << endl;system("pause");return 0;
}

java版

import java.util.Arrays;
import java.util.Scanner;/*** Time: 2019-01-22     Author: snowy* 链接:https://www.nowcoder.com/questionTerminal/f58859adc39f4edc9cd8e40ba4160339* 来源:牛客网** 【题目描述】魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。*             小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。*             如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。* 输入描述: 输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。*           第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。** 输出描述:输出一个整数,表示小易最多能游历的城市数量。* */public class TravelMagicCountry {public static int travelMagicCountry(int nodeNum, int steps, int []ways) {int []dp = new int[nodeNum];            // 存储每个节点的高度// 首先需要求这棵树的最大高度int max_depth = 0;for (int i = 0; i < nodeNum - 1; i ++) {dp[i + 1] = dp[ways[i]] + 1;            // 每个节点的高度等于父节点的高度+1,  parent[i] 当作是(i+1)节点的的父亲节点max_depth = Math.max(max_depth, dp[i + 1]);}System.out.println(Arrays.toString(dp));int d = Math.min(steps, max_depth);return Math.min(nodeNum, 1 + d + (steps - d)/2);}public static void main(String[] args) {Scanner input = new Scanner(System.in);while(input.hasNext()) {int nodeNum = input.nextInt();int steps = input.nextInt();if (nodeNum <= 1)break;int[] ways = new int[nodeNum - 1];for (int i = 0; i < nodeNum - 1; i ++) {ways[i] = input.nextInt();}int res = travelMagicCountry(nodeNum, steps, ways);System.out.println(res);}}
}

这篇关于游历魔法王国的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610239

相关文章

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

玩转Python Turtle库,实现满屏飘字的魔法!

前言     本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Python环境。然后,你需要安装或更新Turtle库(通常Python安装时自带了Turtle库)。 二、编写代码 接下来,我们将通过编写一个简单的P

重复采样魔法:用更多样本击败单次尝试的最强模型

这篇文章探讨了通过增加生成样本的数量来扩展大型语言模型(LLMs)在推理任务中的表现。 研究发现,重复采样可以显著提高模型的覆盖率,特别是在具有自动验证工具的任务中。研究还发现,覆盖率与样本数量之间的关系可以用指数幂律建模,揭示了推理时间的扩展规律。尽管多数投票和奖励模型在样本数量增加时趋于饱和,但在没有自动验证工具的任务中,识别正确样本仍然是一个重要的研究方向。 总体而言,重复采样提供了一种

07_TensorFlow2图像编解码大揭秘:让图片说‘变’就‘变’,魔法还是科技?

1. 图像的编码和解码 在实际应用中,图像数据源格式多种多样,如:png\jpg\bmp等,而神经网络训练模型所需的图像的数据格式为:图像字节数据或Base64编码数据等。基于此,将png\jpg\bmp等格式的图像转换为字节数据的过程称为图像编码,将字节数据的图像转换为png\jpg\bmp等格式图像的过程称为图像解码。 2. 图像编码 Tensorflow图像编码的过程如下图所示,分

【Jupyter】 Notebook 中的 IPython 魔法:12个必知实用技巧

Jupyter Notebook 作为一个强大的交互式计算环境,结合 IPython 的功能,为数据科学家和程序员提供了丰富的工具。本文将介绍12个在 Jupyter Notebook 中使用 IPython 的实用技巧 1. 清除输出:使用 clear_output() from IPython.display import clear_output# 执行一些操作print("This

【深度学习 激活函数】激活函数:深度学习界的“魔法药剂”

大家好!今天我们来聊聊深度学习中的一个重要角色——激活函数。你是否曾经好奇过,为什么神经网络能像魔法一样识别图片、理解和生成文字?答案就在于这些神奇的激活函数! 激活函数:神经网络的“心跳” 想象一下,神经网络就像一个巨大的生物体,而激活函数就是它的心跳。没有心跳,生物体就无法生存;同样,没有激活函数,神经网络就无法正常工作。 激活函数的“魔法” 激活函数就像是给神经网络施加了魔法,让它们

【C#编程技术总结】魔法包唤醒同一局域网设备

目录 一、原理 Wake-on-LAN (WOL) 的工作原理 典型应用场景 配置要求 注意事项 二、代码 一、原理 魔术包(Magic Packet)是Wake-on-LAN(WOL)技术的一部分,它允许远程唤醒网络设备,如计算机或服务器。这个功能通常用于节能和远程管理,当设备处于待机或休眠状态时,可以通过网络将其唤醒,而无需物理操作。 Wake-on-LAN (WOL

Python中的集合魔法:解锁高效数据处理的秘密

引言 集合是一种不允许重复元素的数据结构,并且其内部元素无序排列。这种特性使得集合在某些场景下表现得极为出色: 去重:快速去除列表或数组中的重复项。交集、并集、差集等运算:用于比较两个或多个集合间的关系,非常适用于权限控制、用户管理等领域。性能优势:相较于列表,集合在查找元素时速度更快,平均时间复杂度为O(1)。 基础语法介绍 创建集合 在Python中创建一个空集合需要使用set()函

CSS选择器的魔法:探索:not-child()与:nth-child()

CSS选择器是前端开发中的强大工具,它们允许我们以精确的方式选择和操作网页上的元素。在这篇文章中,我们将深入探讨两个非常有用的CSS选择器::not-child()和:nth-child()。通过这些选择器,我们可以创建动态且具有吸引力的网页布局。 :not-child():排除特定元素 :not-child()选择器允许我们排除特定元素,从而对其他元素应用样式。这在创建复杂的布局时非常有用,

《C++模板元编程:编程世界的魔法艺术》

在 C++的广阔编程领域中,模板元编程犹如一种神秘而强大的魔法艺术,为开发者打开了一扇通往极致性能与高度灵活性的大门。那么,究竟什么是模板元编程?又该如何在 C++中进行模板元编程呢? 首先,让我们来理解一下模板元编程的概念。模板元编程是一种在编译期进行计算和代码生成的技术。它利用 C++模板的强大功能,将程序的一部分计算和决策从运行时转移到编译期。通过这种方式,可以在编译期完成一些复杂的任务,