天梯赛模拟选题2

文章详细描述了如何根据中序和后序遍历序列构建二叉树,并计算其左视图和右视图,涉及递归、层次遍历及记忆化搜索优化技巧。
摘要由CSDN通过智能技术生成

L2-3 浪漫侧影 - 2024天梯赛JXNU模拟4 (pintia.cn)

题意:其实就是让根据中序序列和后序序列建树,然后输出左视图和右视图,左视图就是在层序遍历序列中每一层中最左边的点,右视图就是在层序遍历序列中每一层中最右边的点。

思路:建树方式 + 便建树边层序(看代码即可)

这里有两个比较好的思想,一个是建树方式,一个是在建树的过程中对层序遍历序列进行存储

根据中序序列和后序序列建树的思想:中序左根右,后序左右根,所以后序序列的最后一个字母即是根节点,然后在中序序列中找到该根节点的位置,将序列分成左右两部分(即左右两子树),于是即可把后序序列也分成左右两部分,然后递归的去对左右子树做同种操作就可以了,直到中序序列长度为0时,说明树已经分完了(树建好了)

层序序列就是每一次递归操作中,在后序序列中找出的根节点

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 30;
vector<int> ans[N]; //存每一层的层序遍历序列 
int maxd; 

void dfs(string in, string post, int deep)
{
	if(!in.size()) return;
	
	char k = post[post.size() - 1]; //找到是每一层子树的根 
	int pos = in.find(k); //找到当前根在中序序列中的位置 
	
	ans[deep].push_back(k - '0'); //边建树边层序 
	maxd = max(maxd, deep); //更新深度 
	
	dfs(in.substr(0, pos), post.substr(0, pos), deep + 1); //递归的去做左右子树 
	dfs(in.substr(pos + 1), post.substr(pos, post.size() - 1 - pos), deep + 1);
}

signed main()
{
	int n;
	cin >> n;
	
	string in;
	string post;
	for(int i = 1; i <= n; i ++ ) //转换成字符序列方便操作 
	{
		int x;
		cin >> x;
		in += (x + '0');
	}
	
	for(int i = 1; i <= n; i ++ )
	{
		int x;
		cin >> x;
		post += (x + '0');
	}
	
	dfs(in, post, 1);
	
	cout << maxd << " ";
	cout << "R: " << endl;
	for(int i = 1; i <= maxd; i ++ )
		cout << ans[i][ans[i].size() - 1] << " ";
		
	cout << endl;
		
	cout << "L: " << endl;
	for(int i = 1; i <= maxd; i ++ )
		cout << ans[i][0] << " ";
	return 0;
}

L2-043 龙龙送外卖 - 团体程序设计天梯赛-练习集 (pintia.cn)

题意:一个外卖员,动态的给出要送外卖的地点,然后算出每增加一个工作点后的最短路程是多少,注意这里有个阅读理解:每次送完外卖后都要回到外卖站去拿下一份外卖,当所有外卖送完后(即最后一次送外卖送完就可以了)不需要回快递站。

思路:其实读懂题了就相当显然,答案就是sum * 2 - maxd,sum为当前要走的总路程,maxd为当前要走的最大路程(最后一段再走它就好了)

因为要搜索很多次,考虑加入记忆化搜索优化,因为本题给出的是每个子节点的父节点是谁,可以考虑反向搜索,即从子节点往父节点搜索,反向搜索从子节点到根节点的距离

#include<bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int, int> PII;

const int N = 1e5 + 10;

int p[N]; //p[i]存的是第i个节点的父节点 
int d[N]; //储存第i个节点的最大深度 
int sum;

int dfs(int u) //记忆化搜索
{
	if(p[u] == -1 || d[u] != 0) return d[u];
	 
	sum ++; //神之一手,总路程直接用sum累加即可 
	d[u] = dfs(p[u]) + 1;
	return d[u];
}

void solve()
{
	int n, m;
	cin >> n >> m;
	
	for(int i = 1; i <= n; i ++ ) cin >> p[i];
	
	int maxd = 0;
	while(m -- )
	{
		int x;
		cin >> x;
		
		maxd = max(maxd, dfs(x)); //更新加入当前点后的最大距离 
		cout << sum * 2 - maxd << endl;
	}
}

signed main()
{
	int t = 1;
	while(t -- ) solve();
	return 0;
}

Unity车游戏的选题意义可以从以下几个方面来考虑: 1. 提高游戏的可玩性和真实性:Unity车游戏是一种比较特殊的游戏类型,玩家需要掌握车辆的速度、重量、惯性等物理属性,并应对复杂的场景设计和路线规划。因此,对Unity车游戏进行交互设计研究可以提高游戏的可玩性和真实性,为玩家提供更加流畅、有趣、真实的游戏体验。 2. 探索游戏的控制方式:Unity车游戏的控制方式是非常重要的一点,需要根据玩家的操作习惯和游戏类型进行选择,如使用键盘、手柄、触屏等方式来控制车辆。因此,对Unity车游戏进行交互设计研究可以探索不同的游戏控制方式,以提供玩家一个更加自由、灵活的游戏操作体验。 3. 提高游戏的难度和挑战性:Unity车游戏需要考虑到道路的宽度、弯曲程度、障碍物的设置等等,以增加游戏的难度和挑战性。因此,对Unity车游戏进行交互设计研究可以探索不同的场景设计和障碍物设置,以提高游戏的难度和挑战性。 4. 增加游戏的可持续性:Unity车游戏的交互设计研究还可以考虑如何设计游戏关卡、如何设置难度、如何提供奖励等等,以吸引玩家并增加游戏的可持续性。 5. 推动游戏产业发展:Unity车游戏是一个非常有潜力的游戏类型,可以为游戏产业发展提供新的思路和理论支持,推动相关产业的发展和进步。 综上所述,对Unity车游戏进行交互设计研究的选题意义非常重要,可以提高游戏的可玩性和真实性、探索不同的游戏控制方式、提高游戏的难度和挑战性,以及增加游戏的可持续性,同时还可以推动游戏产业的发展和进步。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值