算法【贪心经典题目专题5】

devtools/2025/2/23 0:41:32/
题目一

测试链接:45. 跳跃游戏 II - 力扣(LeetCode)

分析:这道题用cur代表走完当前步数可以来到的最大长度,next代表如果多走一步可以来到的最大长度,然后遍历索引,如果当前步数可以来到的最大长度小于遍历到的索引,步数加1,最大长度更新为多走一步可以来到的最大长度,每一次遍历索引都会更新多走一步可以来到的最大长度。代码如下。

class Solution {
public:int jump(vector<int>& nums) {int length = nums.size();int cur = 0;int next = 0;int ans = 0;for(int i = 0;i < length;++i){if(cur < i){++ans;cur = next;}next = max(i + nums[i], next);}return ans;}
};

题目二

测试链接:1326. 灌溉花园的最少水龙头数目 - 力扣(LeetCode)

分析:这道题思路和上道题差不多,用一个数组存储左边界从i开始的水龙头范围最右可以到达的下标。cur为当前水龙头数可以覆盖的最右下标,next是如果多用一个水龙头可以覆盖的最右下标。遍历下标,每次遍历更新多用一个水龙头可以覆盖的最右下标。如果当前水龙头数可以覆盖的最右下标等于遍历到的下标则需要判断,如果多用一个水龙头可以覆盖的最右下标依旧等于当前下标,则代表即使多用一个水龙头,也不能覆盖住后一个范围,所以返回-1;否则多用一个水龙头,当前最右下标更新为多用一个水龙头的最右下标。代码如下。

class Solution {
public:int right[10001] = {0};int minTaps(int n, vector<int>& ranges) {int start;for(int i = 0;i <= n;++i){start = max(0, i - ranges[i]);right[start] = max(i + ranges[i], right[start]);}int cur = 0;int next = 0;int ans = 0;for(int i = 0;i < n;++i){next = max(next, right[i]);if(cur == i){if(next == i){return -1;}else{++ans;cur = next;}}}return ans;}
};

题目三

测试链接:P1809 过河问题 - 洛谷

分析:这道题求最少渡河时间有两种方法,一种是让最少渡河时间依次和每一个人过到西岸,然后最少渡河时间划到东岸继续和另一个人渡河;另一种是让最小的两个渡河时间到西岸,然后最大的两个渡河时间一起到西岸,由西岸的最少渡河时间将船划到东岸。而具体是哪一种需要判断,所以需要使用动态规划。代码如下。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> person;
vector<int> dp;
int main(void){scanf("%d", &N);person.resize(N);for(int i = 0;i < N;++i){scanf("%d", &person[i]);}if(N == 1){printf("%d", person[0]);}else if(N == 2){printf("%d", max(person[0], person[1]));}else{dp.resize(N);sort(person.begin(), person.end());dp[0] = person[0];dp[1] = person[1];for(int i = 2;i < N;++i){dp[i] = min(dp[i-1] + person[0] + person[i],dp[i-2] + person[0] + person[i] + person[1] + person[1]);}printf("%d", dp[N-1]);}return 0;
}

其中,dp数组表示0~i都到西岸且船留在西岸的最少渡河时间,可能性的展开就是两种,一是让西岸的最小渡河时间将船划到东岸和剩下的i一起到西岸;另一种是让最小渡河时间将船划到东岸,在东岸的i-1和i一起到西岸,船由现在西岸的最小渡河时间划到东岸,然后东岸的两个人一起到西岸。

题目四

测试链接:517. 超级洗衣机 - 力扣(LeetCode)

分析:这道题可以遍历每一个洗衣机,以遍历到的洗衣机为中转站,看中转站左边需要多少衣服,中转站右边需要多少衣服,求出最多需要多少操作步数使左右两边需要的衣服和已有的衣服相等。然后取最大操作步数即是答案。代码如下。

class Solution {
public:int findMinMoves(vector<int>& machines) {int length = machines.size();int sum = machines[0];for(int i = 1;i < length;++i){sum += machines[i]; }if(sum % length != 0){return -1;}machines.push_back(0);int average = sum / length;int ans = 0;int left = 0, right = sum - machines[0];int left_deserve = 0, right_deserve = (length - 1) * average;int left_need = left_deserve - left, right_need = right_deserve - right;for(int i = 0;i < length;++i){if(left_need > 0 && right_need > 0){ans = max(ans, left_need + right_need);}else{ans = max(ans, max(abs(left_need), abs(right_need)));}left += machines[i];right -= machines[i+1];left_deserve += average;right_deserve -= average;left_need = left_deserve - left;right_need = right_deserve - right;}return ans;}
};


http://www.ppmy.cn/devtools/161070.html

相关文章

C# dynamic 关键字 使用详解

总目录 前言 dynamic 是 C# 4.0 引入的关键字&#xff0c;用于声明动态类型&#xff0c;允许在运行时解析类型和成员&#xff0c;而非编译时。它主要设计用于简化与动态语言&#xff08;如 Python、JavaScript&#xff09;的交互、处理未知结构的数据&#xff08;如 JSON、XML…

新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)

上一节我们讲了二极管的原理, 原文章: https://zhuanlan.zhihu.com/p/25252117833 看了的朋友应该很容易懂这节课 这篇文章我们来说说三极管的工作原理啊 这里要说下几个概念 1 半导体的导通, 就是说里面的负电荷电子和正电荷空穴可以大量的从 一个地方达到我们想要的地方…

通义灵码AI程序员

通义灵码是阿里云与通义实验室联合打造的智能编码辅助工具&#xff0c;基于通义大模型技术&#xff0c;为开发者提供多种编程辅助功能。它支持多种编程语言&#xff0c;包括 Java、Python、Go、TypeScript、JavaScript、C/C、PHP、C#、Ruby 等 200 多种编码语言。 通义灵码 AI…

系统学习算法:专题十一 floodfill算法

介绍&#xff1a; floodfill算法简单来说就是求出相同性质的联通块 比如在上面这个矩阵中&#xff0c;如果我们要求出所有负数的联通块&#xff0c;就可以使用floodfill算法&#xff0c;但联通必须是上下左右&#xff0c;斜对角的不行 其中实现的方法有深度优先遍历&#xff…

1.21作业

1 unserialize3 当序列化字符串中属性个数大于实际属性个数时&#xff0c;不会执行反序列化 外部如果是unserialize&#xff08;&#xff09;会调用wakeup&#xff08;&#xff09;方法&#xff0c;输出“bad request”——构造url绕过wakeup 类型&#xff1a;public class&…

A. C05.L08.贪心算法入门

这套题包含了历年真题&#xff0c;十分重要&#xff01;&#xff01;&#xff01;&#xff01;要考试的同学可以参考一下&#xff01;&#xff01; 此套题限时3小时。 A. C05.L08.贪心算法入门&#xff08;一&#xff09;.课堂练习1.书架(SSOI2017五年级t6) 传统题1000ms256…

25会计研究生复试面试问题汇总 会计专业知识问题很全! 会计复试全流程攻略 会计考研复试真题汇总

宝子们&#xff0c;会计考研复试快到了&#xff0c;是不是有点慌&#xff1f;别怕&#xff01;今天学姐给你们支招&#xff0c;手把手教你搞定复试面试&#xff0c;直接冲上岸&#xff01;快来看看怎么准备吧&#xff0c;时间紧直接背第三部分的面试题&#xff01; 目录 一、复…

如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能

本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时&#xff0c;使用到了 Pipeline 功能&#xff0c;并对此做出了整理。 一、Redis Pipeline 是什么 Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能&#xff0c;性能提升的原因在于可以批量执行命令。当我…