2020-09-06

满载而归 小红书

笔试时没有写出来,但是可以作为参考,如果有错误,请指正。
思路是,把海盗行船路径看成一颗n叉树,
例如
输入为:
5
2 3 3
2 3 5

海盗所有的路径为:
在这里插入图片描述
n是多少呢?
对于本例 ,速度可以取2,3,所以n为2, 是一颗二叉树。
采用bfs,遍历每个节点,利用hash表判断当前地点是否为危险地点。

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <climits>
using namespace  std;
vector<int> vec;


 
//测试1
/*
5
2 3 3
2 3 5
*/

//测试2
/*
10
2 3 4
2 3 5 6
*/


int main()
{
	int X;
	int L, T, N;
	int res = INT_MAX;
	cin >> X;
	cin >> L >> T >> N;
	unordered_map<int, bool> A;
	queue<pair<int,int>> q;
	int tmp;
	for (int i = 0; i < N; i++)
	{
		cin >> tmp;
		A[tmp] = true;
	}
	q.push(make_pair(0, 0));
	while (!q.empty())
	{
		int cur = q.front().first;
		int cnt = q.front().second;
		q.pop();
		if (cur>= X)
		{
			continue;
		}
		for (int v = L; v <= T; v++)
		{
			int forwardV = cur + v;
			if (A.find(forwardV) != A.end())
			{	
				q.push(make_pair(forwardV, cnt + 1));
			}
			else
				q.push(make_pair(forwardV, cnt));
			if (forwardV >= X)
			{
				int tmp = q.back().second;
				vec.push_back(tmp);
			}
		}
	}

	//for (auto ele : vec)  //打印,根据测试用例,判断一下遍历是否有问题
	//{                 
	//	cout << ele << " ";
	//}
	for (int i = 0; i < vec.size(); i++)
	{
		res = min(res, vec[i]);
	}
	cout << res << endl;
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值