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.pswp.cn/news/900320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900320.shtml
英文地址,請注明出處:http://en.pswp.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…