跳板问题(贪心算法+细节思考)

首先直接看题:

这题直接贪心其实问题不大:

下面先展示我的一个错误代码:

cpp 复制代码
# include<iostream>
# include<vector>
# include<algorithm>

using namespace std;

int main()
{
	int N,M;
	cin>>N>>M;
	vector<vector<int>> arr(N,vector<int>(2));
	for(int i=0;i<N;i++)
	{
		cin>>arr[i][0]>>arr[i][1];
	}
	
	// 感觉贪心应该就能解决
	int distance = 0;
	int step = 0;
	int i = 0;
	
	// 可能少考虑了一点
	while(distance<=M)
	{
		if(distance<=arr[i][0])
		{
			step+=arr[i][0]-distance;
			distance = arr[i][0]+arr[i][1];
		}
		else if(distance>arr[i][0]){
			i++;
			if(i>=N)
			{
				step+=M-distance;
				break;
			}
		}
	}
	
	cout<<step<<endl;
	return 0;
}

其实整体思路是没有问题的,

但题目里面有一个细节,就是说**"每个跳板能够将胡同学发射到一定距离内的任意位置。"**

这时候问题就来了,比如距离起点为5,能跳长度为6的这样一个板,它在5-11之间还是会有其他的跳板,所以,在5-11他也不需要自行走路,因为他目前的跳板可以把他送到5-11范围内的任意位置,那么如果有这样一个跳板,距离起点7,跳板长度是10,那么借助这个跳板就可以直接达到17这个位置,这是之前代码没有考虑到的,之前的代码直接是认为做上5跳板,到达的位置就是11,这就是问题所在,所以i++的过程中需要进行一个判断。

所以最终代码就是:

cpp 复制代码
# include<iostream>
# include<vector>
# include<algorithm>

using namespace std;

int main()
{
	int N,M;
	cin>>N>>M;
	vector<vector<int>> arr(N,vector<int>(2));
	for(int i=0;i<N;i++)
	{
		cin>>arr[i][0]>>arr[i][1];
	}
	
	// 感觉贪心应该就能解决
	int distance = 0;
	int step = 0;
	int i = 0;
	
	// 可能少考虑了一点
	int current_pos = 0;
	while(distance<M&&i<N)
	{
		if(current_pos<=arr[i][0])
		{
			step+=arr[i][0]-distance;
			current_pos = arr[i][0];
		}
		distance = arr[i][0]+arr[i][1]; // 前一个跳板能达到的最远距离
		if(distance>current_pos)
		{
			current_pos = distance;
		}
		
		i++;
	}
	
	
	if(current_pos<M)
	{
		step+=M-current_pos;
	}
	
	cout<<step<<endl;
	return 0;
}

最主要的点就是一个比较。

相关推荐
油泼辣子多加5 小时前
【实战】自然语言处理--长文本分类(3)HAN算法
算法·自然语言处理·分类
Shinom1ya_5 小时前
算法 day 46
数据结构·算法
草莓熊Lotso5 小时前
C++ 方向 Web 自动化测试实战:以博客系统为例,从用例到报告全流程解析
前端·网络·c++·人工智能·后端·python·功能测试
共享家95276 小时前
LRU 缓存的设计与实现
开发语言·c++
夏鹏今天学习了吗6 小时前
【LeetCode热题100(64/100)】搜索旋转排序数组
算法·leetcode·职场和发展
2301_796512526 小时前
Rust编程学习 - 问号运算符会return一个Result 类型,但是如何使用main函数中使用问号运算符
开发语言·学习·算法·rust
草莓熊Lotso6 小时前
Linux 基础开发工具入门:软件包管理器的全方位实操指南
linux·运维·服务器·c++·人工智能·网络协议·rpc
小龙报6 小时前
算法通关指南:数据结构和算法篇 --- 队列相关算法题》--- 1. 【模板】队列,2. 机器翻译
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
晨非辰7 小时前
【数据结构初阶】--从排序算法原理分析到代码实现操作,参透插入排序的奥秘!
c语言·开发语言·数据结构·c++·算法·面试·排序算法
三川6988 小时前
排序算法介绍
数据结构·算法·排序算法