基礎演算法 二分法 最大值最小化

2021-10-04 13:38:14 字數 1351 閱讀 9828

有乙個序列,將其劃分成3個連續的子串行s(1)、s(2)、s(3),每個子串行最少有乙個元素,要求使得每個子串行的和的最大值最小

輸入

622

3451

輸出

**來自:大佬傳送門

#include

#include

using

namespace std;

#define n 10

#define inf 1000

//分治的思維

intjuge

(int a,

int mid,

int k)}if

(seg >= k)

//若是段超過3,則必然不和條件

return0;

else

return1;

}//最小值,最大值 m

intvalue

(int a,

int low,

int high,

int segment)

//分治法求解

}int

main()

;int m =3;

cout << endl;

//求出佇列中所有數的和max,還要求出當中最小的數min

int min = inf, max =0;

for(

int i =

0; i < n && a[i]

!=' '

; i++

)//求出了最小值和所有值的總和

cout << endl;

//這裡是什麼意思求出最大最小值

int tem =

value

(a, min, max, m)

;//呼叫value函式求值

cout << tem << endl;

return0;

}

思路

上界為總和,下界為最小值,然後再分別取終點,直到上界《下界 那裡極值就為那個點,取值代表,根據取的中點數,把序列分為幾段,利用分治,然後實現最佳的選擇。

總結

在去最大值最小化問題上,應該想到二分法,其check()函式判斷需要更加深入的思考,希望下次碰見這樣的題,能夠快速的反應過來。希望自己更加優秀。

二分法解決最大值最小化問題

把乙個包含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,則...

二分法解決最大值最小化問題

問題描述 把乙個包含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 ...

二分 最小化最大值

注意答案的二分性質,必須要滿足在滿足給定條件的所有情況的時候都滿足要求才能更新ans。include using namespace std typedef long long ll inline ll in while c 0 c 9 res res 10 c 48,c getchar retur...