數列分段 Section II

来源:https://www.cnblogs.com/momotrace/archive/2023/07/02/p1182.html
-Advertisement-
Play Games

# 數列分段 Section II ## 題目描述 對於給定的一個長度為N的正整數數列 $A_{1\sim N}$,現要將其分成 $M$($M\leq N$)段,並要求每段連續,且每段和的最大值最小。 關於最大值最小: 例如一數列 $4\ 2\ 4\ 5\ 1$ 要分成 $3$ 段。 將其如下分段: ...


數列分段 Section II

題目描述

對於給定的一個長度為N的正整數數列 \(A_{1\sim N}\),現要將其分成 \(M\)\(M\leq N\))段,並要求每段連續,且每段和的最大值最小。

關於最大值最小:

例如一數列 \(4\ 2\ 4\ 5\ 1\) 要分成 \(3\) 段。

將其如下分段:

\[[4\ 2][4\ 5][1] \]

第一段和為 \(6\),第 \(2\) 段和為 \(9\),第 \(3\) 段和為 \(1\),和最大值為 \(9\)

將其如下分段:

\[[4][2\ 4][5\ 1] \]

第一段和為 \(4\),第 \(2\) 段和為 \(6\),第 \(3\) 段和為 \(6\),和最大值為 \(6\)

並且無論如何分段,最大值不會小於 \(6\)

所以可以得到要將數列 \(4\ 2\ 4\ 5\ 1\) 要分成 \(3\) 段,每段和的最大值最小為 \(6\)

輸入格式

\(1\) 行包含兩個正整數 \(N,M\)

\(2\) 行包含 \(N\) 個空格隔開的非負整數 \(A_i\),含義如題目所述。

輸出格式

一個正整數,即每段和最大值最小為多少。

樣例 #1

樣例輸入 #1

5 3
4 2 4 5 1

樣例輸出 #1

6

提示

對於 \(20\%\) 的數據,\(N\leq 10\)

對於 \(40\%\) 的數據,\(N\leq 1000\)

對於 \(100\%\) 的數據,\(1\leq N\leq 10^5\)\(M\leq N\)\(A_i < 10^8\), 答案不超過 \(10^9\)

解析&代碼

二分答案

先介紹下二分答案吧

比如我們要從一本英漢詞典上查一個單詞,如果你從頭到尾一頁一頁的翻著找(並仔細一點),這樣找可以保證一定能找到,但是最壞情況你要把整本詞典都翻一遍,那就麻煩了(而且很累)。

有什麼改進的方法嗎?當然有。

我們考慮把這個詞典從中間分開,看一下中間那一頁的主要單詞都是啥,然後去判斷我要找的單詞應該在左半部分還是右半部分,再去那一部分考慮怎麼找就好了。同樣的,在另一部分也是要進行劃分並且判斷的操作。這樣一直進行下去,便能很快的找到答案,而且根本不需要翻過整個詞典來。

可以證明,如果一頁一頁的找,最多要找 \(n\) 次,但是用這個方法,最多找\(floor(log2n)\)次。

我們把這個方法叫做“二分答案”。顧名思義,它用二分的方法枚舉答案,並且枚舉時判斷這個答案是否可行。但是,二分並不是在所有情況下都是可用的,使用二分需要滿足兩個條件:

  1. 有上下界

  2. 區間有單調性

二分答案應該是在一個單調閉區間上進行的。也就是說,二分答案最後得到的答案應該是一個確定值,而不是像搜索那樣會出現多解。二分一般用來解決最優解問題。剛纔我們說單調性,那麼這個單調性應該體現在哪裡呢?

可以這樣想,在一個區間上,有很多數,這些數可能是我們這些問題的解,換句話說,這裡有很多不合法的解,也有很多合法的解。我們只考慮合法解,並稱之為可行解。考慮所有可行解,我們肯定是要從這些可行解中找到一個最好的作為我們的答案, 這個答案我們稱之為最優解。

最優解一定可行,但可行解不一定最優。我們假設整個序列具有單調性,且一個數x為可行解,那麼一般的,所有的 \(x'(x'<x)\) 都是可行解。並且,如果有一個數y是非法解,那麼一般的,所有的 \(y'(y'>y)\) 都是非法解。

那麼什麼時候適用二分答案呢?註意到題面:使得選手們在比賽過程中的最短跳躍距離儘可能長。如果題目規定了有“最大值最小”或者“最小值最大”的東西,那麼這個東西應該就滿足二分答案的有界性(顯然)和單調性(能看出來)。

所以(快點)上代碼吧。。。

#include <bits/stdc++.h>
using namespace std;
int n,m,a[100010],l,r;
int f(int x)
{
	int ret=0,last=0;
	for(int i=1;i<=n;i++)
	{
		if(last+a[i]<=x)
		{
			last+=a[i];
		}
		else{
			ret++;
			last=a[i];
		} 
	}
	return ret;
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
	}
	for(int i=1;i<=n;i++)
	{
	 	l=max(l,a[i]);
		r+=a[i];
	}
	while(l<r)
	{
		int mid=(l+r)/2;
		if(f(mid)>=m)
		{
			l=mid+1;
		}
		else{
			r=mid;
		}
	}
	cout << l;
	return 0;
}

本文來自小默的博客,轉載請註明原文鏈接:https://www.cnblogs.com/momotrace/p/p1182.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天說明瞭Windows Powershell的使用方法,本來以為這就是適合自己的小工具了,沒想到狠狠打了自己的臉,不能夠顯示圖形化界面。(pavucontrol命令會顯示圖形化音量設置選項) 而且在網上沒找到相應的解決辦法,有知道的大佬們可以在評論區指個路子,萬分感謝。 自己沒有辦法,於是就從以 ...
  • Oracle能夠讓你在無須修改非Null值數據的情況下方便地把Null值排到最前面或者最後面,其他資料庫得添加一個輔助列 ...
  • 本文以 `React`、`Vue` 為例,介紹下主流的渲染模式以及在主流框架中如何實現上述的渲染模式。 ## 前置知識介紹 看渲染模式之前我們先看下幾個主流框架所提供的相關能力,瞭解的可跳到下個章節。 ### 掛載組件到 DOM 節點 這是主流框架最基本的能力,就是將組件渲染到指定的 `DOM` 節 ...
  • 關鍵字 abstractassertbooleanbreakbyte case catch char class const continue default do double else enum extends final finally float for goto if implementi ...
  • 不說廢話,直接上乾貨: (註意大小寫:object為對象,Object為類) 1,object.getClass()它是Object類的實例方法,返回一個對象運行時的類的Class對象,換句話說,它返回的是對象具體類型的類對象。 2,Object.class 這是java語言的一種語法糖,用來返回一 ...
  • # 前言 最近針對java項目的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等 發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則複雜對於小白很不友好,也難以接入到自定義的部署工具/平臺中 之前開發的Jar包部署平臺是servlet ...
  • 數組索引是指在`numpy`數組中引用特定元素的方法。`numpy`的數組索引又稱為`fancy indexing`,比其他編程語言的索引強大很多。 # 1. 選取數據 numpy的索引除了像其他語言一樣選擇一個元素,還可以間隔著選取多個元素,也可以用任意的順序選取元素。 比如一維數組: ```py ...
  • urllib+BeautifulSoup爬取並解析2345天氣王歷史天氣數據 網址:[東城歷史天氣查詢_歷史天氣預報查詢_2345天氣預報](https://tianqi.2345.com/wea_history/71445.htm) ![image-20230702161423470](https ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...