把乙個包含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,不是最小。
要解決最大值最小化的問題,基本思路就是選取任意乙個範圍(輸入陣列的最大值到陣列所有元素的和),然後在這個範圍內進行二分法,每次把和範圍的中間值mid當作最小值,然後判斷在mid值下陣列是否能夠被分為m個部分
#include
int n,m;
bool judge(const
int *a,int key)
}if((count+1)<=m)
return
1; return0;}
void binary(const
int *a,int left,int right)
else
}printf("%d\n",left); // ,right %d
}int main()
} binary(a,left,right);
}
return
0;
}
二分法解決最大值最小化問題
問題描述 把乙個包含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 ...
基礎演算法 二分法 最大值最小化
有乙個序列,將其劃分成3個連續的子串行s 1 s 2 s 3 每個子串行最少有乙個元素,要求使得每個子串行的和的最大值最小 輸入 622 3451 輸出 來自 大佬傳送門 include include using namespace std define n 10 define inf 1000 ...
二分 最小化最大值
注意答案的二分性質,必須要滿足在滿足給定條件的所有情況的時候都滿足要求才能更新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...