二分+前綴和——森林的最大美麗值

森林的最大美麗值(二分+差分數組)

題目分析

求最小值的最大值,聯想到二分。

第一階段二段性分析

對于所有樹的高度都可以大于等于mid,那么我們可以確定高度小于mid的值一定也可以,但是此時我需要找的是最大的高度,那么mid一定比小于mid的值更大,所以小于mid的值我就不用管了,也就是我可以確定我能夠舍棄掉mid左邊的值。我還想要確定比mid更大的邊長是否也滿足條件,所以我要在mid的右邊繼續二分。

if (check(mid)) {l = mid;} //因為mid是符合條件的,所以我要留著它,而不是l=mid+1

對于所有樹的高度不能滿足都大于等于mid,那么我們可以確定高度大于mid的值一定也不滿足,所以大于等于mid的值我就不用管了,也就是我可以確定我能夠舍棄掉mid右邊的值。我還想要尋找比mid更小的高度是否能滿足條件,所以我要在mid的左邊繼續二分。

else { r = mid - 1; }//因為mid是不符合條件的,所以我不要留著它,而不是r=mid
//主要這里出現了減法,那么求mid那么應該是(l+r+1)/2

綜上該題滿足二段性,可以用二分,二分的板子就不說了,接下來說一下check函數如何寫。

第二階段寫check函數

check(u)要實現的作用是檢查能否在m天內讓所有樹的高度都大于等于u。

依次遍歷每一棵樹,如果當前樹的高度a[i]小于mid,那么需要給他增高,增高耗費的天數是(mid-a[i])。但是我們要注意一旦選擇增高不是只給一顆樹增高,而是給一個區間里的樹進行增高,那么這就涉及到區間修改,我們可以使用差分數組。現在重新考慮遍歷每一棵樹,當前樹的實際高度是a[i]+sum[i],這里的sum[i]是差分數組的前綴和,如果a[i]+sum[i]<x,那么我們要給這棵樹增高,耗費的天數和增加的高度是x-a[i]-sum[i],對于差分數組的變化是d[i]+=x-a[i]-sum[i],d[i+k]-=x-a[i]-sum[i],注意這里的i+k可能會有下標越界問題,所以要改成d[min(i+k,n+1)]-=x-a[i]-sum[i],如果耗費的總天數超過了m,即cnt<0,就返回false,否則返回true。注意這里更改了d[i]后,對應的sum[i]也要隨之更新,否則這里d[i]的改變沒有傳遞下去。

public static boolean check(int x) {int d[] = new int[100010];int sum[] = new int[100010];int cnt = m;for(int i=1;i<=n;i++) {sum[i] =sum[i-1]+d[i];if(a[i]+sum[i]<x) {cnt-=x-a[i]-sum[i];d[i]+=x-a[i]-sum[i];d[Math.min(i+k,n+1)]+=sum[i]+a[i]-x;sum[i]+=x-a[i]-sum[i];if(cnt<0) return false;}}return true;
}

第三步二分范圍確定

那么這里的高度的最小值是1,最大值就是樹的最大高度,也就是1e9+1。

題目代碼

import java.util.Scanner;
public class Main {static int n,m,k;static int a[] = new int[100010];public static boolean check(int x) {int d[] = new int[100010];int sum[] = new int[100010];int cnt = m;for(int i=1;i<=n;i++) {sum[i] =sum[i-1]+d[i];if(a[i]+sum[i]<x) {cnt-=x-a[i]-sum[i];d[i]+=x-a[i]-sum[i];d[Math.min(i+k,n+1)]-=x-a[i]-sum[i];sum[i]+=x-a[i]-sum[i];if(cnt<0) return false;}}return true;}public static void main(String[] args) {Scanner scan = new Scanner(System.in);n=scan.nextInt();m=scan.nextInt();k=scan.nextInt();for(int i=1;i<=n;i++) a[i]=scan.nextInt();int l=1,r=1000000001;while(l<r) {int mid=(l+r+1)/2;if(check(mid)) l=mid;else r=mid-1;}System.out.print(l);}
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m, k;
int a[N];
int d[N], sum[N];bool check(int x) {for (int i = 1; i <= n; ++i) d[i]=0,sum[i]=0;int cnt = m;for (int i = 1; i <= n; ++i) {sum[i] = sum[i - 1] + d[i];if (a[i] + sum[i] < x) {cnt -= x - a[i] - sum[i];d[i] += x - a[i] - sum[i];if (i + k <= n) d[i + k] -= x - a[i] - sum[i];sum[i] += x - a[i] - sum[i];if (cnt < 0) return false;}}return true;
}int main() {cin >> n >> m >> k;for (int i = 1; i <= n; ++i) cin >> a[i];int l = 1, r = 1000000001;while (l < r) {int mid = (l + r + 1) / 2;if (check(mid)) l = mid;else r = mid - 1;}cout << l << endl;return 0;
}
def check(x):d = [0] * (n + 1)sum = [0] * (n + 1)cnt = mfor i in range(1, n + 1):sum[i] = sum[i - 1] + d[i]if a[i] + sum[i] < x:cnt -= x - a[i] - sum[i]d[i] += x - a[i] - sum[i]if i + k <= n:d[i + k] -= x - a[i] - sum[i]sum[i] += x - a[i] - sum[i]if cnt < 0:return Falsereturn Truen, m, k = map(int, input().split())
a = [0] + list(map(int, input().split()))  # Using 1-based indexingl, r = 1, 1000000001#+1e5
while l < r:mid = (l + r + 1) // 2if check(mid):l = midelse:r = mid - 1print(l)

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

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

相關文章

Pytorch實現之最小二乘梯度歸一化設計

簡介 簡介:LSGAN提出了一種利用最小二乘法來計算兩個數據分布之間的距離,該論文在此基礎上采用梯度歸一化來進一步穩定訓練。 論文題目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一種新的生成對抗網絡的最小…

JavaScript基礎-全局作用域

在JavaScript編程中&#xff0c;理解變量的作用域是編寫高效、可維護代碼的關鍵之一。全局作用域是指變量在整個程序范圍內都可訪問的狀態&#xff0c;這意味著它們可以在任何函數或代碼塊中被讀取和修改。然而&#xff0c;過度使用全局變量也可能導致一些問題&#xff0c;如命…

【2025.3.13】記一次雙系統筆記本加裝固態硬盤記錄 linux擴容 linux更換/home和/opt所在硬盤 windows無法調整亮度

文章目錄 &#x1f315;事情經過&#x1f315;更換/home和/opt的掛載硬盤&#x1f319;目的&#x1f319;初始化1t固態硬盤&#x1f319;打開Linux查看硬盤信息&#x1f319;給新1t固態硬盤分區&#x1f319;格式化分區&#x1f319;把新1t固態硬盤先掛載到/mnt/ssd_1t 用于后續…

山東省新一代信息技術創新應用大賽-計算機網絡管理賽項(樣題)

目錄 競賽試題 網絡拓撲 配置需求 虛擬局域網 IPv4地址部署 OSPF及路由部署 配置合適的靜態路由組網 MSTP及VRRP鏈路聚合部署 IPSEC部署 路由選路部署 設備與網絡管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 競賽試題 本競賽使用HCL(華三云實驗室)來進行網絡設備選擇…

【測試語言基礎篇】Python基礎之List列表

一、Python 列表(List) 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff0c;依此類推。 Python有6個序列的內置類型&#xff0c;但最常見的是列表和元組。序列都可…

大數據面試之路 (二) hive小文件合并優化方法

大量小文件容易在文件存儲端造成瓶頸&#xff0c;影響處理效率。對此&#xff0c;您可以通過合并Map和Reduce的結果文件來處理。 一、合并小文件的常見場景 寫入時產生小文件&#xff1a;Reduce任務過多或數據量過小&#xff0c;導致每個任務輸出一個小文件。 動態分區插入&…

MySQL 批量插入 vs 逐條插

MySQL 插入數據&#xff1a;批量插入 vs 逐條插入&#xff0c;哪個更快&#xff1f; 在 MySQL 中&#xff0c;插入數據有兩種常見方式&#xff1a; 批量插入&#xff1a;一條 SQL 插入多條數據。逐條插入&#xff1a;每次插入一條數據。 這兩種方式有什么區別&#xff1f;哪…

Docker基礎命令說明

Docker基礎操作命令眾多&#xff0c;這些命令可以按如下方式進行分類&#xff1a; 鏡像操作容器操作網絡操作數據卷操作LOG查詢 等方面進行分類。 一、鏡像操作命令 docker images&#xff1a;用于列出本地系統中所有的 Docker 鏡像。鏡像就像是一個模板&#xff0c;它包含…

AI重構私域增長:從流量收割到終身價值運營的三階躍遷

私域運營的AI進化論&#xff1a;內容即服務的三個階段 隨著企業微信生態的成熟&#xff0c;私域運營正經歷從"流量收割"到"關系養成"的本質轉變。在AIGC技術的推動下&#xff0c;2024年私域場景正式進入**"內容即服務"**的價值共創期&#xff1…

Linux date 命令使用指南

date 命令用于 顯示或設置系統日期和時間&#xff0c;支持靈活的時間格式化和計算。以下是常用場景與詳細示例&#xff1a; 一、基本用法 1. 顯示當前日期和時間 <BASH> date # 輸出&#xff1a;Thu Jun 13 14:25:36 CST 20242. 設置系統時間&#xff08;需root權限&am…

Maven的依賴管理

maven相關依賴的官網&#xff1a;https://mvnrepository.com/ pom.xml是項目依賴的配置文件 maven首先會去本地倉庫下載相關依賴&#xff0c;如果沒有&#xff0c;則會去私服下載&#xff0c;再沒有&#xff0c;就去中央倉庫或鏡像下載。 自定義properties&#xff0c;可使用…

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相當于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…

向量庫集成指南

文章目錄 向量庫集成指南Chroma集成Pinecone集成MiLvus集成向量庫集成指南 向量庫是一種索引和存儲向量嵌入以實現高效管理和快速檢索的數據庫。與單獨的向量索引不同,像Pinecone這樣的向量數據庫提供了額外的功能,例如,索引管理、數據管理、元數據存儲和過濾,以及水平擴展…

軟件測試之使用Requests庫進行接口測試

文章目錄 前言Requests庫是什么為什么要用Requests庫進行接口測試安裝Requests庫Requests庫使用發送GET請求發送帶查詢參數的GET請求響應內容格式添加請求頭信息發送一個POST請求查看響應內容斷言請求超時Cookie與Session模擬登錄 參考目錄 前言 閱讀本文前請注意最后編輯時間…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 這個錯誤通常是由于 Matplotlib 的后端配置問題引起的。具體來說&#xff0c;Matplotlib 在嘗試加載某個后端時&#xff0c;發現該后端模塊中缺少必要的屬性&#xff08;如 FigureCanvas&#xff09;&a…

iWebOffice2015 中間件如何在Chrome107及之后的高版本中加載

iWebOffice2015是江西金格科技有限公司開發的一款智能文檔中間件&#xff0c;和一些知名OA及ERP公司曾經達成OEM合作&#xff0c;所以用戶一度比較多&#xff0c;但不幸的是Chromium內核瀏覽器在2022年10月份發布的107版本中永久取消了對PPAPI插件的加載支持&#xff0c;導致使…

【MyBatis Plus JSON 處理器簡化數據庫操作】

文章目錄 什么是 MyBatis-Plus JSON 處理器&#xff1f;開始使用 MyBatis-Plus JSON 處理器步驟 1: 創建實體類步驟 2: 創建 Mapper 接口步驟 3: 查詢 JSON 數據步驟 4: 插入和更新 JSON 數據 什么是 MyBatis-Plus JSON 處理器&#xff1f; MyBatis-Plus 是一個基于 MyBatis 的…

OpnenHarmony 開源鴻蒙北向開發——1.開發環境搭建(DevEco Studio 5.03)

我這邊是基于window下對OpenHarmony開源鴻蒙進行北向開發。 一、安裝DevEco Studio 1、下載 下載中心 | 華為開發者聯盟-HarmonyOS開發者官網&#xff0c;共建鴻蒙生態 2、安裝 下載完成之后進行解壓 雙擊進行安裝 按照我的步驟進行 選擇安裝目錄&#xff0c;全部配置完成后…

深入 Python 網絡爬蟲開發:從入門到實戰

一、為什么需要爬蟲&#xff1f; 在數據驅動的時代&#xff0c;網絡爬蟲是獲取公開數據的重要工具。它可以幫助我們&#xff1a; 監控電商價格變化抓取學術文獻構建數據分析樣本自動化信息收集 二、基礎環境搭建 1. 核心庫安裝 pip install requests beautifulsoup4 lxml …

linux(ubuntu)中Conda、CUDA安裝Xinference報錯ERROR: Failed to build (llama-cpp-python)

文章目錄 一、常規辦法二、繼續三、繼續四、缺少 libgomp庫&#xff08;最終解決&#xff09;在 Conda 環境中安裝 libgomp 如果符合標題情況 執行的&#xff1a; pip install "xinference[all]"大概率是最終解決的情況。 一、常規辦法 llama-cpp-python 依賴 CMak…