這是一道典型的二分答案問題(最大值最小,最小值最大)關鍵是對於細節的處理。
二分的框架:
//l=max,r=sum
while(l<=r)else l=m+1;
}cout
《二分的框架是普遍使用的,關鍵是檢驗函式的設計,此處的檢驗函式的含義為: 是否存在一種合法的劃分,使得每段的最大值都不大於m。
設計好了檢驗函式,就要思考l與r的轉移:若存在這種合法的劃分,說明m偏大,r=m-1;反之,l=m+1.
此處應注意l的初始值為num中的最大值。
#include
#include
#include
#include
using
namespace
std;
int read()
while(c>='0'&&c<='9')
return fh*rv;
}int n,m,num[100005],pre[100005];
bool chk(int x)
}tot++;
if(tot<=m) return
1; else
return
0;}
int main()
r=pre[n];
while(l<=r)else l=m+1;
}cout
fclose(stdin);
return
0;}
洛谷P1182數列分段
對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段 4 2 4 5 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 2 4 5 1 第一段和為4...
洛谷 P1182數列分段Section II
對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段 4 2 4 5 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 2 4 5 1 第一段和為4...
洛谷 P1182 數列分段Section II
題目描述 對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段 4 2 4 5 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 2 4 5 1 第...