【華為OD-E卷-木板 100分(python、java、c++、js、c)】

【華為OD-E卷-木板 100分(python、java、c++、js、c)】

題目

小明有 n 塊木板,第 i ( 1 ≤ i ≤ n ) 塊木板長度為 ai。

小明買了一塊長度為 m 的木料,這塊木料可以切割成任意塊,拼接到已有的木板上,用來加長木板。

小明想讓最短的模板盡量長。請問小明加長木板后,最短木板的長度可以為多少?

輸入描述

  • 輸入的第一行包含兩個正整數, n ( 1 ≤ n ≤ 10^3 ), m ( 1 ≤ m ≤ 10^6 ),n 表示木板數, m 表示木板長度。

輸入的第二行包含 n 個正整數, a1, a2,…an ( 1 ≤ ai ≤ 10^6 )

輸出描述

  • 輸出的唯一一行包含一個正整數,表示加長木板后,最短木板的長度最大可以為多少?

用例

用例一:
輸入:
5 3
4 5 3 5 5
輸出:
5
用例二:
輸入:
5 2
4 5 3 5 5
輸出:
4

python解法

  • 解題思路:
  • 本題的目的是找到一個最大長度,使得我們可以通過給定的操作數量 m 來調整數組 a 中的元素,使得所有元素都至少達到該長度。每次操作可以增加某個元素的值。我們希望通過二分法來高效地找到這個最大長度。

具體步驟:
輸入分析:首先,輸入的是兩個整數 n 和 m,分別表示數組 a 的長度和我們可以進行的操作次數。接著輸入一個整數列表 a,表示數組的初始值。

核心問題:我們需要判斷是否可以通過最多 m 次操作將所有元素增加到某個長度 L(即 L 為數組中的最小值)。為了檢查是否能達到某個長度 L,我們可以計算將每個元素增加到 L 所需的操作次數。如果總操作次數不超過 m,則說明可以實現。

二分查找:為了快速找到最大長度,可以用二分查找:

low 初始化為數組中的最小值,high 初始化為數組中的最大值加上 m,因為最多可以將數組元素增加 m。
在二分查找過程中,每次判斷當前中點 mid 是否能通過 m 次操作實現。如果能,則嘗試增大 mid;如果不能,則減小 mid。
判斷函數:can_achieve_length 用于判斷是否能將所有元素至少調整到某個長度 length,它的核心是計算每個元素需要增加多少才能達到該長度,并判斷是否總操作數不超過 m。

n, m = map(int, input().split())  # 讀取n和m,n是數組的長度,m是可以進行的操作次數
a = list(map(int, input().split()))  # 讀取數組a# 判斷是否能通過m次操作將所有元素調整到至少length的值
def can_achieve_length(length, a, m):needed = sum(max(0, length - x) for x in a)  # 計算所有元素增加到length所需要的操作次數return needed <= m  # 如果操作次數不超過m,則返回True# 利用二分查找找到最大長度
def find_max_length(a, m):low, high = min(a), max(a) + m  # 初始范圍,最小值是數組的最小元素,最大值是數組最大值加上mbest = low  # 保存當前找到的最佳長度while low <= high:  # 二分查找mid = (low + high) // 2  # 計算中間值if can_achieve_length(mid, a, m):  # 如果可以通過m次操作使所有元素至少為midbest = mid  # 更新最佳長度low = mid + 1  # 嘗試尋找更大的值else:high = mid - 1  # 嘗試尋找更小的值return best  # 返回找到的最大長度print(find_max_length(a, m))  # 輸出結果

java解法

  • 解題思路
更新中

C++解法

  • 解題思路
更新中

C解法

  • 解題思路

更新中

JS解法

  • 解題思路

  • 這道題目要求我們找到一個最大值,使得通過至多 m 次操作,可以將數組 a 中的所有元素調整到至少達到這個值。每次操作可以增加數組元素的值。為了高效地找到這個最大值,我們可以利用 二分查找 的方法。

具體步驟:
輸入分析:輸入的第一個值是 n(數組的長度),第二個是 m(最多可以進行的操作次數)。接著輸入數組 a,其元素表示需要調整的值。

核心問題:對于給定的 m 次操作,能否將數組的所有元素至少增加到某個長度 mid。如果每個元素都小于 mid,就需要增加相應的差值。目標是找出最大的 mid,使得通過至多 m 次操作就能將數組所有元素調整到至少 mid。

二分查找:我們可以通過二分查找來找到這個最大長度 mid,從 low = min(a) 到 high = max(a) + m。每次計算 mid,并判斷是否能通過 m 次操作達到這個長度。如果能,則說明可以嘗試更大的 mid,否則減小 mid。

判斷函數:在每一次的二分查找中,我們需要計算將所有元素調整到 mid 所需的總操作次數,判斷是否不超過 m。

// 最大長度查找函數
function maxMinLength(m, a) {let low = Math.min(...a);  // 初始時,low為數組a中的最小值let high = Math.max(...a) + m;  // high為數組a中的最大值加上操作次數mwhile (low < high) {  // 二分查找const mid = Math.floor((low + high + 1) / 2);  // 計算中點值,向上取整const needed = a.reduce((sum, length) => {  // 計算將所有元素調整到mid所需的操作次數return sum + Math.max(0, mid - length);  // 對于小于mid的元素,計算差值}, 0);if (needed <= m) {  // 如果操作次數不超過m,說明可以嘗試更大的midlow = mid;  // 更新low值} else {  // 否則,減少midhigh = mid - 1;}}return low;  // 最終返回的low即為最大能達到的長度
}// 讀取輸入的部分
const readline = require('readline');
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let input = [];rl.on('line', (line) => {input.push(line);  // 逐行讀取輸入
}).on('close', () => {const [n, m] = input[0].split(' ').map(Number);  // 解析n和mconst a = input[1].split(' ').map(Number);  // 解析數組aconsole.log(maxMinLength(m, a));  // 調用函數輸出結果
});

注意:

如果發現代碼有用例覆蓋不到的情況,歡迎反饋!會在第一時間修正,更新。
解題不易,如對您有幫助,歡迎點贊/收藏

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63897.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sqlserver臨時表來做表聯查復雜查詢

使用臨時表&#xff0c;先查詢出結果&#xff0c;在用于后面表的子查詢或者聯查 -- 刪除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已刪除臨時表 #temp_PublishRecordend--創…

OMG DDS 規范漫談:分布式數據交互的演進之路

一、由來與起源脈絡 OMG DDS&#xff08;Object Management Group Data Distribution Service&#xff09;的發展是計算機科學和技術進步的一個縮影&#xff0c;它反映了對高效、可靠的數據共享需求的響應。DDS 的概念萌生于20世紀90年代末&#xff0c;當時分布式計算已經從理…

1.使用 Couchbase 數倉和 Temporal(一個分布式任務調度和編排框架)實現每 5 分鐘的增量任務

在使用 Couchbase 數倉和 Temporal&#xff08;一個分布式任務調度和編排框架&#xff09;實現每 5 分鐘的增量任務時&#xff0c;可以按照以下步驟實現&#xff0c;同時需要注意關鍵點。 實現方案 1. 數據層設計&#xff08;Couchbase 增量存儲與標記&#xff09; 在 Couchb…

Spring源碼分析之AOP-@EnableAspectJAutoProxy

前言 這篇文章之前我們說了Springboot的啟動流程,Bean對象怎么實現從無到有的一個過程還有一些接口的拓展的實現等等那么從這一篇文章開始的話我們就會開始說一說我們的常用的AOP它的底層實現原理所以大家一起加油加油&#xff01;&#xff01;&#xff01; AOP: 1.簡介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服務器硬件信息查看 1.1.服務器廠商、產品名稱查看 dmidecode -s system-manufacturer&#xff1a;查看服務器廠商信息 dmidecode -s system-product-name&#xff1a;查看服務器產品名稱信息 1.Windows使用VMware安裝的Linux(Centos 7.6)后&#xff0c;服務器廠商、產品名…

多個圖片轉換為PDF文件

將多個圖片轉換為PDF文件在Python中可以通過多個庫來實現&#xff0c;其中最常用的庫之一是Pillow&#xff08;用于圖像處理&#xff09;和reportlab&#xff08;用于生成PDF&#xff09;。不過&#xff0c;對于直接圖片轉PDF的操作&#xff0c;更推薦使用Pillow配合PyMuPDF&am…

小程序app封裝公用頂部篩選區uv-drop-down

參考ui:DropDown 下拉篩選 | 我的資料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生態框架 樣式示例&#xff1a; 封裝公用文件代碼 dropDownTemplete <template><!-- 頂部下拉篩選區封裝公用組件 --><view><uv-drop-down ref&…

LeetCode:101. 對稱二叉樹

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;101. 對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸…

Docker-如何啟動docker

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。希望大家多多關注作者&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。 我們在上一章&#xff0c;講了虛擬化&#xff0c;虛擬化是把硬件虛擬化&#xff0c;然后創建出來的虛擬機完全隔離&#xff…

COMSOL with Matlab

文章目錄 基本介紹COMSOL with MatlabCOMSOL主Matlab輔Matlab為主Comsol為輔 操作步驟常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 實例教學自動另存新檔**把語法套用到邊界條件**把語法套用到另存新檔 函數及其微分…

游戲關卡設計方法的雜感

1、正規思路是&#xff1a;先寫設計文檔&#xff0c;畫平面圖&#xff0c;再做白模關卡&#xff0c;再做正規模型的關卡。 一步步擴大。 當然是有道理的&#xff0c;從小到大&#xff0c; 但實際上這需要很強的想象力&#xff0c;很多細節靠腦補&#xff0c;初學者很難做好。…

JVM系列(十二) -常用調優命令匯總

最近對 JVM 技術知識進行了重新整理&#xff0c;再次獻上 JVM系列文章合集索引&#xff0c;感興趣的小伙伴可以直接點擊如下地址快速閱讀。 JVM系列(一) -什么是虛擬機JVM系列(二) -類的加載過程JVM系列(三) -內存布局詳解JVM系列(四) -對象的創建過程JVM系列(五) -對象的內存分…

bmp390l傳感器的IIC命令通信(學習匯總)

參考鏈接&#xff1a; BMP390高精度壓力傳感器數據讀取與處理&#xff08;基于STM32&#xff09;-CSDN博客 https://blog.csdn.net/qq_43862401/article/details/106502397 利用usb轉iic模塊測試bmp390l傳感器采集當前環境的溫度和氣壓數據&#xff0c;下圖中reserved表示…

C/C++基礎知識復習(43)

1) 什么是運算符重載&#xff1f;如何在 C 中進行運算符重載&#xff1f; 運算符重載是指在 C 中為現有的運算符定義新的行為&#xff0c;使得它們能夠用于用戶定義的數據類型&#xff08;如類或結構體&#xff09;。通過運算符重載&#xff0c;可以讓自定義類型像內置數據類型…

Windows11 家庭版安裝配置 Docker

1. 安裝WSL WSL 是什么&#xff1a; WSL 是一個在 Windows 上運行 Linux 環境的輕量級工具&#xff0c;它可以讓用戶在 Windows 系統中運行 Linux 工具和應用程序。Docker 為什么需要 WSL&#xff1a; Docker 依賴 Linux 內核功能&#xff0c;WSL 2 提供了一個高性能、輕量級的…

2025系統架構師(一考就過):案例題之一:嵌入式架構、大數據架構、ISA

一、嵌入式系統架構 軟件脆弱性是軟件中存在的弱點(或缺陷)&#xff0c;利用它可以危害系統安全策略&#xff0c;導致信息丟失、系統價值和可用性降低。嵌入式系統軟件架構通常采用分層架構&#xff0c;它可以將問題分解為一系列相對獨立的子問題&#xff0c;局部化在每一層中…

新手SEO指南如何快速入門與提升網站排名

內容概要 搜索引擎優化&#xff08;SEO&#xff09;是提高網站可見度和排名的重要手段&#xff0c;尤其對新手來說&#xff0c;掌握其基本概念和實用技巧至關重要。本文將針對新手提供一系列的指導&#xff0c;幫助你快速入門并逐步提升網站排名。 首先&#xff0c;了解SEO的…

Oracle下載安裝(保姆級教學)

方法1 1. 官網下載安裝包 對于 Oracle 軟件的下載&#xff0c;建議通過官網免費下載&#xff0c;安全且有保證。 下載地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 通過下載頁面可以選擇安裝壓縮包&#xff08; WIND…

第22天:信息收集-Web應用各語言框架安全組件聯動系統數據特征人工分析識別項目

#知識點 1、信息收集-Web應用-開發框架-識別安全 2、信息收集-Web應用-安全組件-特征分析 一、ICO圖標&#xff1a; 1、某個應用系統的標示&#xff0c;如若依系統有自己特點的圖標&#xff1b;一旦該系統出問題&#xff0c;使用該系統的網站都會受到影響&#xff1b; 2、某個公…

重溫設計模式--建造者模式

文章目錄 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML圖作用&#xff1a;建造者模式的結構產品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具體建造者&#xff08;Concrete Builder&#xff…