006贪心——算法备赛

跨步问题

跳跃游戏||

问题描述

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

原题链接

思路分析

nums[0]=x从起点0处出发走1步能到达[0,x]内的所有点,不必纠结具体要到那个点反正到不了x+1及以后的点,遍历[0,x]区间内的每个点i,用nums[i]+i来更新走第2步能到达的最远点next,等遍历到x点,第二步所能到达的点的范围就是[x+1,next],以此类推,直到遍历到终点。

具体实现上,定义cur表示走ans步所能到达的最远点,next表示下一阶段所能到达的最远点,从左到右依次遍历,等遍历到cur时,表示到达ans步所能到达的最远点,若还没到达终点,则ans++,cur更新为next,最后的ans就是答案。

以{2,4,3,12,0,5,1}为例:
在这里插入图片描述
代码

int jump(vector<int>& nums) {int n = nums.size(), ans = 0, cur = 0, next = 0;  //cur为走ans步能到达的最远处.for (int i = 0; i < n - 1; i++) {  //注意i截止到n-2.next = max(next, i + nums[i]);  //next为走ans+1步能到达的最远处.if (i == cur) cur = next, ans++; //到达ans步所能到达的最远处cur,后面还有节点,ans需要再+1,cur更新为next}return ans;}

总结:不用关系每一步走到哪的细节,到达ans所能到达的最远点后,贪心地选取下一阶段能到达的最远点next为阶段终点,步步为营。

达到数组末尾的最大得分

问题描述

给你一个长度为 n 的整数数组 nums

你的目标是从下标 0 出发,到达下标 n - 1 处。每次你只能移动到 更大 的下标处。

从下标 i 跳到下标 j 的得分为 (j - i) * nums[i]

请你返回你到达最后一个下标处能得到的 最大总得分

原题链接

思路分析

首先来分析一个子问题,1.从0下标处直接跳到n-1下标处,2.从0跳到中间某个下标i处再跳到n-1下标处,方案2的总得分比方案1大吗?

  1. nums[i]>nums[0] 则nums[0] * i + nums[i] * (n-1-i) > nums[0] * i+nums[0] (n-1-i)

    nums[0] * i + nums[i] * (n-1-i) > nums[0] * (n-1) 方案2总得分大

  2. nums[i]<=nums[0] 则nums[0] * i + nums[i] * (n-1-i) <= nums[0] * i+nums[0] (n-1-i)

    nums[0] * i + nums[i] * (n-1-i) >= nums[0] * (n-1) 方案2总得分没有更大

综上说明当中间有某个下标对应数组值大于nums[0]时,方案2的总得分才更大。

这也说明最佳方案是否要中转到i处,判断nums[i]是否大于上一阶段起点对应的nums值。

定义tar,初始时为nums[0]*(n-1),表示从0下标直接跳到n-1下标处的总得分

运用贪心思想,从下标1开始从左往右遍历,每次遍历到nums[i],判断nums[i]是否大于上一阶段的起点数组值,是说明中转i 处的方案获得的总得分比直接到终点获得的总得分要大;

此时便更新 上一阶段获得最大得分值目标历史最大值上一阶段起点数组值上一阶段起点下标值

直到遍历完n-2,此时的目标历史最大值即为目标最大分数

代码

long long findMaximumScore(vector<int>& nums) {long long n=nums.size();long long tar=(long long)nums[0]*(n-1);long long maxn=nums[0];  //上一阶段起点数组值long long mt=0;  //上一阶段起点下标值long long tr=0;  //上一阶段获得最大得分值for(int i=1;i<n-1;i++){if(nums[i]>maxn){tr+=(i-mt)*maxn;tar=tr+nums[i]*(n-i-1);maxn=nums[i];mt=i;}}return tar;}

区间交集问题

用最少数量的箭引爆气球

问题描述

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstartxend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 startend, 且满足 start ≤ x ≤ end,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points返回引爆所有气球所必须射出的 最小 弓箭数

原题链接

思路分析

首先对数组升序排序,定义一个变量pos,表示当前箭射在的位置,第一箭射在第一个气球的右边界,定义一个变量ans表示最少箭数,数组不为空时初始为1;

往右遍历每个气球,每当有新的气球的左边界小于等于pos,说明该气球可和前面气球有重叠部分可以一箭射穿,否则说明没有重叠部分,重置pos为其右边界,箭数+1

代码

int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) {return u[1] < v[1];  //以右边界为标准升序排序});int pos = points[0][1];int ans = 1;for (auto balloon: points) {if (balloon[0] > pos) {pos = balloon[1];++ans;}}return ans;}

无重叠区间

问题描述

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

注意 只在一点上接触的区间是 不重叠的。例如 [1, 2][2, 3] 是不重叠的。

思路分析

求移除区间的最少数目,相当于求保留区间的最多数目,参照上一题用最少数量的箭引爆气球,k个两两相交的区间只能保留一个,为使后续保留的互不重叠的区间最多,应保留右边界最小的那个,将数组按右区间大小升序排序,定义一个变量right,代表当前两两相交区间集合的右边界,从左往右遍历每个区间,每当有区间左边界小于right,则该区间可以舍弃,否则更新右边界为当前区间的右边界,并将保留区间统计量m+1。最后intervals.size() - m就是答案。

将区间数组按右区间大小升序排序,再从左往右遍历,保证了枚举的区间右边界逐渐增大,使每个独立的两两相交区间集合的右边界尽量小,让后面能容纳更多的独立区间,最后统计的m就是保留区间数量的最大值。

代码

int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) {return a[1] < b[1];});int m = 1;int right = intervals[0][1];for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= right) {m++;right = intervals[i][1];}}return intervals.size() - m;}

构造连续值问题

构造的连续值的最大数目

问题描述

给你一个长度为 n 的整数数组 coins ,它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币,它们的和为 x ,那么称,你可以 构造x

请返回,你最多能 构造 出多少个从 0 开始(包括 0 )的连续整数。

你可能有多个相同值的硬币。

思路分析

1798.png

设我们现在能构造出[0,x]区间的整数,现在我们新增一个整数 y,那么我们可以构造出的区间为[0,x][y,x+y],那么如果 y≤x+1,则加入整数 y 后我们能构造出 [0,x+y] 区间的整数,否则我们还是只能构造出连续的 [0,x] 区间的数字。

具体实现上,我们每次从数组中找到未选择数字中的最小值来作为 y,因为如果此时的最小值 y 都不能更新区间 [0,x],那么剩下的其他更大元素肯定不能更新区间 [0,x]。那么我们初始从 x=0 开始,按照升序来遍历数组 nums 的元素来作为 y,如果 y≤x+1 那么我们扩充区间为 [0,x+y],否则我们无论选任何未选的数字都不能使答案区间变大,此时直接退出即可。

代码

int getMaximumConsecutive(vector<int>& coins) {int res = 1;sort(coins.begin(), coins.end());for (auto& i : coins) {if (i > res) {break;}res += i;}return res;}
作者:灵茶山艾府

最少砝码

问题描述

你有架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于N的正整数重量。

那么这套砝码最少需要多少个砝码?

注意天平的两边都可以放砝码。

思路分析

本题与上一题相似,略有不同之处在于,本题用数字构造连续区间可以用减法(放在天平另一侧)。思路大体相同。

设我们现在能构造出[1,x]区间的所有整数,现在新增一个y,那能构造出的区间为[1,x],[y-x,y],[y,x+y]

如果y-x<=x+1y<=2x+1则加入整数 y 后我们能构造出 [1,x+y] 区间的所有整数,最优方案的y是2x+1

  • 1个砝码时,使用最优方案,用重量为1的砝码,能称出的最大的从1开始连续的最大重量是sum(1)=1
  • 2个砝码时,使用最优方案,添加一个重量为sum(1)*2+1=3的砝码,能称出最大的从1开始连续的最大重量是sum(2)=sum(1)+3
  • 依次类推,n个砝码,能称出符合要求的最大上界是sum(n-1)*2+1+sum(n-1)3*sum(n-1)+1

具体实现上,sum记录所能称出符合要求的最大上界,cnt记录砝码个数。每次添加一个砝码,并更新sum值,当sum>=n时的cnt就是答案。

#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;int sum = 1, cnt = 1; //sum存储可以表示区间的最大值while(sum<n){sum+=sum*2+1;  //也可写成sum=3*sum+1cnt++;}cout << cnt ;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL学习笔记(三)——图形化界面工具DataGrip

目录 1. 图形化界面工具 2.下载 3. 安装 3.1 安装步骤 3.2 激活说明 4. 使用 4.1 汉化教程 4.2 使用 1. 图形化界面工具 上述&#xff0c;我们已经讲解了通过 DDL 语句&#xff0c;如何操作数据库、操作表、操作表中的字段&#xff0c;而通过 DDL 语句执行在命令进行操…

编程题学习

acwing 826. 单链表 #include <iostream>using namespace std;const int N 100010;int idx, e[N], ne[N], head;void init() {head -1;idx 0; }void insert_head(int x) {e[idx] x;ne[idx] head;head idx ; }void delete_k_pos(int x, int k) {e[idx] x;ne[idx…

modelscope环境准备--装conda、内网穿透、配置HuggingFace

1 准备anaconda #1、安装包 wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh#2、提高权限 chmod x Anaconda3-2024.10-1-Linux-x86_64.sh#3、执行安装命令 ./Anaconda3-2024.10-1-Linux-x86_64.sh#4、一直按Enter健继续 yes继续 Enter#5、手动激…

算法题(117):字符串的展开

审题&#xff1a; 本题需要我们根据题目的要求将字符串进行扩展 思路&#xff1a; 方法一&#xff1a;模拟法 一般来说题目字数和要求很多的题就是模拟题&#xff0c;模拟题特别需要注意的就是细节&#xff0c;在编写代码之前一定要把细节想清楚&#xff0c;否则很容易出错。 分…

15使用按钮实现helloworld(2)

目录 通过纯代码的方式实现的 按版 hello world 通过图形化界面的方式&#xff0c;实现的 按钮版 hello world 通过纯代码的方式实现的 按版 hello world 对于纯代码版本,按钮对象是咱们自己 new 的 为了保证其他函数中能够访问到这个变量,就需要把按钮对象 设定为 Widget 类…

Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?

Nacos 服务发现的核心模型 Nacos 服务发现的核心数据模型主要围绕以下几个关键概念构建&#xff0c;它们共同构成了服务注册与发现的基础&#xff1a; Namespace (命名空间): 用途: 用于进行环境隔离。比如&#xff0c;你可以为开发环境 (dev)、测试环境 (test) 和生产环境 (p…

VMware 安装 Ubuntu 全流程实战指南:从零搭建到深度优化

在软件开发、系统测试以及技术学习等诸多场景中&#xff0c;使用虚拟机安装操作系统是一种灵活且高效的方式。Ubuntu 作为一款优秀的开源操作系统&#xff0c;在 VMware 虚拟机上的安装与优化备受关注。接下来&#xff0c;将为大家带来 VMware 安装 Ubuntu 的全流程实战指南&am…

探秘叁仟智盒设备:智慧城市的智能枢纽

在智慧城市建设的宏伟蓝图中&#xff0c;各类先进技术与设备层出不穷&#xff0c;叁仟智盒设备作为其中的关键一环&#xff0c;正悄然发挥着巨大作用&#xff0c;为城市的智能化转型注入强大动力。 一、叁仟智盒设备概述 叁仟智盒设备是杭州叁仟智慧城市科技有限公司旗下的重…

晶晨S905L3S/S905L3SB_安卓9.0_10秒开机_通刷-线刷固件包

晶晨S905L3S&#xff0f;S905L3SB_安卓9.0_10秒开机_通刷-线刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 使用晶晨刷机工具USB_Burning_Tool进行刷机&#xff1b;请使用Amlogic USB Burning Tool v2.2.5或v2.2.7&#xff08;晶晨线刷烧录工具v2.2…

VSCode中结合DeepSeek使用Cline插件的感受

前言 听网上有传言说AI智能插件Cline非常的好用&#xff0c;而且相对Cursor而言还是免费的&#xff0c;捆绑的大模型选择也比较的广泛。所以&#xff0c;特意安装试用了一下。 我的采用IDE是VSCode&#xff0c;捆绑的大模型是最近比较火的DeepSeek。总体使用下来感觉非常的棒。…

蓝桥云客--破译密码

5.破译密码【算法赛】 - 蓝桥云课 问题描述 在近期举办的蓝桥杯竞赛中&#xff0c;诞生了一场激动人心的双人破译挑战。比赛的主办方准备了N块神秘的密码芯片&#xff0c;参赛队伍需要在这场智力竞赛中展示团队合作的默契与效率。每个队伍需选出一位破译者与一位传输者&#…

中国移动启动数字乡村“五新升级”:年底前,行政村5G覆盖达95%

大湾区经济网品牌观察报道&#xff0c;近日&#xff0c;在国家全面推进乡村振兴的战略背景下&#xff0c;中国移动近日发布数字乡村升级行动计划&#xff0c;以“AI大模型数智化平台”为核心引擎&#xff0c;围绕“五新升级”构建“两个新型”信息服务体系。 一、数字基建筑基&…

智慧节能双突破 强力巨彩谷亚VK系列刷新LED屏使用体验

当前全球节能减排趋势明显&#xff0c;LED节能屏作为显示技术的佼佼者&#xff0c;正逐渐成为市场的新宠。强力巨彩谷亚万境VK系列节能智慧屏凭借三重技术保障、四大智能设计以及大师臻彩画质&#xff0c;在实现节能效果的同时&#xff0c;更在智慧显示领域树立新的标杆。   …

Apache 配置负载均衡详解(含配置示例)

Apache 是互联网上最受欢迎的 Web 服务器之一。除了基本的网页服务&#xff0c;它还能通过模块扩展出丰富的功能。其中一个重要用途就是将 Apache 配置成负载均衡器&#xff0c;用于在多个后端服务器之间分配流量&#xff0c;提升网站的性能和稳定性。Google Gemini中国版调用G…

GESP:2025-3月等级8-T1-上学

时间限制 : 1 秒 内存限制 : 128 MB C 城可以视为由 n个结点与 m条边组成的无向图。这些结点依次以1,2,....n标号&#xff0c;边依次以 1,2...m标号。第i条边&#xff08;1<i<m &#xff09;连接编号为ui 与vi的结点&#xff0c;长度为li米。 小 A 的学校坐落在 C 城中…

Nginx介绍及使用

1.Nginx介绍 Nginx是一款开源的、高性能的HTTP和反向代理服务器 1.正向代理和反向代理 正向代理&#xff08;代理客户端&#xff09;是一种位于客户端和目标服务器之间的中间服务器。客户端通过正向代理服务器向目标服务器发送请求&#xff0c;代理服务器将请求转发给目标服…

复古未来主义屏幕辉光像素化显示器反乌托邦效果PS(PSD)设计模板样机 Analog Retro-Futuristic Monitor Effect

这款模拟复古未来主义显示器效果直接取材于 90 年代赛博朋克电影中的黑客巢穴&#xff0c;将粗糙的屏幕辉光和像素化的魅力强势回归。它精准地模仿了老式阴极射线管显示器&#xff0c;能将任何图像变成故障频出的监控画面或高风险的指挥中心用户界面。和……在一起 2 个完全可编…

[巴黎高师课程] 同步反应式系统(2024-2025)第三课 - Kind 2: 基于SMT的Lustre模型检查器

在2024-2025学期的巴黎高师同步反应式系统(2024-2025)第三课中&#xff0c;详细讨论了基于SMT的Lustre模型检查器Kind 2的工作。本文将提供对Kind 2的介绍。对课程的详细内容&#xff0c;可参考同步反应式系统 简介 本节课讨论了基于SMT&#xff08;Satisfiability Modulo The…

轨道交通装备三维检测与轻量化设计

地铁车身与车灯部件作为轨道交通装备的核心组成部分&#xff0c;其制造精度和性能要求极高。由于它们体积庞大、曲面复杂&#xff0c;传统检测方法在面对这些大型、复杂部件时&#xff0c;不仅耗时费力&#xff0c;而且难以实现全面、精确的测量&#xff0c;难以满足高效、准确…

2025大唐杯仿真1——车联网

车联网 V2N是指车辆与网络 Uu接口是用户设备&#xff08;UE&#xff09;与基站之间的通信接口&#xff0c;用于终端和基站之间的通信 Uu接口可用的是N41频段&#xff0c;归属中国移动 车辆间交互是V2V&#xff0c;频段是PCS PC5接口是一种用于设备间直接通信&#xff08;D2D…