分析:給定序列後,我們可以知道任意劃分的最大值的取值範圍[0, sum(1...n)],一種較慢的方法是列舉每種取值情況,根據列舉值進行序列劃分,若劃分的組數大於m,說明沒有滿足條件的劃分情況,需要增加列舉值;如果劃分的組數小於m,說明找到了滿足條件的劃分情況。時間複雜度為o(n*sum);
思路擴充套件:既然找到了線性的列舉方法,我們不妨考慮下二分列舉的方法,考慮mid的情況是否滿足條件,如何劃分組數大於m,與線性列舉的情況相同;若劃分的組數小於m,說明當前解滿足條件,但可能還有比當前解還小的解,需進一步計算。
#includevoid read(int &x)while(ch>='0'&&ch<='9')
x=f?-x:x;
return;
}//讀入優化
int a[1000005],n,m;
int main()
if(ans>m)
l=mid+1;
else
r=mid;
} printf("%d",l);
return 0;
}
最大值最小化
1 目標學會用猜數字 二分 的方法,換個角度來解決問題 2 include3 include 4 include5 const int n 100000 6 7int a n n,m,max 89 void input 1018 19 20bool is part int x 是否能把序列劃分為每個...
最大值最小化 題解
題目描述 把乙個包含 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 分別...
最大值最小化(最大值盡量小)
from 給出是個序列,如1 2 3 2 5 4 將其劃分成m個連續的子串行,每個子串行最少有乙個元素,怎樣使每個子串行的和的最大值最小 include include using namespace std define n 10 define inf 1000 int juge int a,in...