NYOJ 摘枇杷 最大化最小值

2021-07-12 00:54:08 字數 1403 閱讀 7682

枇杷快熟了,

ok,大家都懂得。而且大家都知道,學校的

枇杷樹都是一列一列的。現在小

y同學已經在籌畫怎麼摘

枇杷了。現在我們假設有一列枇杷樹,而且每棵枇杷樹上枇杷果的數量小

y都已經知道了。

假設現在有

n棵枇杷樹,小

y可以把這

n棵枇杷樹分成

m組,每組枇杷果的數量是這組內每棵枇杷樹上枇杷果數量的和。注意,每組的枇杷樹必須是連續的。(每組最少

1棵樹,最多

n棵樹)。小

y把枇杷往寢室拿的時候是一組一組拿的,所花費的力氣等於這

m組中枇杷果最多的那組枇杷果的數量。現在小

y想花盡量少的力氣把這些枇杷果拿回寢室。

每組測試資料第一行有兩個數n(n <= 1000)和m(1 <=m <= n)

第二行有n個數,分別代表每顆樹上枇杷果的數量

1 2 3

7 51 4 3 1 5 2 4

5解釋:

把乙個包含n個正整數的序列劃分成m個連續的子串行。設第i個序列的各數之和為s(i),求所有s(i)的最大值最小是多少?

例子: 

序列1 2 3 2 5 4劃分為3個子序列的最優方案為 1 2 3 | 2 5 | 4,其中s(1),s(2),s(3)分別為6,7,4,那麼最大值為7; 

如果劃分為 1 2 | 3 2 | 5 4,則最大值為9,不是最小。

我們對問題做一些轉化: 

在一次劃分中,求乙個x,使得x滿足:對任意的s(i),都有s(i)<=x;這個條件保證了x是所有s(i)中的最大值。我們需要求的就是滿足該條件的最小的x。

有了這個思路之後,我們繼續分析如何找到這個x,首先,可以知道的是,max <= x <= sum。

接下來先是最樸素的想法:列舉每乙個x,貪心地每次從左向右盡量多劃分元素,但是s(i)不能超過x,而且劃分的子串行個數不能超過m個(即所用劃分線不能超過m-1條)

以上方法當然可行,但是每個x都遍歷一次太浪費時間了。

問題經過轉化,現在變成了在[max, sum]中間查詢乙個滿足條件的x,查詢的問題,相信大家對二分搜尋並不陌生。這個時候,用二分搜尋的思想來求x,效率一下子就上來了。

題目**:

#include#include#define m 1000+5

using namespace std;

int a[m],n,m,mmax,sum;

bool is_part(int mid)else s+=a[i];

} return true;

}int bi_search()

return l;

}int main(){

while(scanf("%d%d",&n,&m)!=eof){

sum=0,mmax=0;

for(int i=0; i

二分 最小值最大化

問題描述 記得上學那會,fbs同學經常會欺負蘿蔔同學。有一次,他出了這麼一道題目,想為難一下蘿蔔同學。題目是這樣的 有n個整數x i,x i值的範圍從0到1000000000。要從中選出c個數 2 c n 使得任意兩個數差的絕對值的最小值盡可能大,求這個最大值。由於資料太大,這次蘿蔔同學的確被難住了...

最大化最小值 二分

aggressive cows 題目意思 農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置 一維的 pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。輸入 n 5m 3x 輸出 3 在位置...

最大化最小值和最小化最大值

最小化最大值是為了壓制優化目標中表現最突出的成分,最大化最小值為了提公升優化目標中表現最差的成分 關於這兩者的理解,我覺得這篇博文講得非常好,淺顯易懂又聯絡實際。理解問題後,就要思考如何解決問題。記住,這兩類問題一般都是用問題轉換加二分查詢的方法解決。我會用 詳細注釋的形式記錄這兩類問題的解法,題目...