有乙個序列,將其劃分成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...