洛谷傳送門
對於給定的乙個長度為n的正整數數列a-ia−i,現要將其分成m(m≤n)m(m≤n)段,並要求每段連續,且每段和的最大值最小。
關於最大值最小:
例如一數列4 2 4 5 142451要分成33段
將其如下分段:
[4 2][4 5][1][42][45][1]
第一段和為66,第22段和為99,第33段和為11,和最大值為99。
將其如下分段:
[4][2 4][5 1][4][24][51]
第一段和為44,第22段和為66,第33段和為66,和最大值為66。
並且無論如何分段,最大值不會小於66。
所以可以得到要將數列4 2 4 5 142451要分成33段,每段和的最大值最小為66。
第11行包含兩個正整數n,m。
第22行包含nn個空格隔開的非負整數a_ia**i,含義如題目所述。
乙個正整數,即每段和最大值最小為多少。
輸入 #1複製
輸出 #1複製
對於20%20%的資料,有n≤10n≤10;
對於40%40%的資料,有n≤1000n≤1000;
對於100%100%的資料,有n≤100000,m≤n, a_in≤100000,m≤n,a**i之和不超過10^9109。
這題其實說的就是數學化了一點,其實實現的時候和p2882和jdoj 2225是一樣的,(就是原題原**),我jdoj 2225講解的詳細一點,所以就用jdoj 2225的題解來看吧。
題解
#include#includeusing namespace std;
const int maxn=1e5+10;
int n,m,cnt,tot;
int l,r,ll,rr;
int a[maxn];
bool check(int x)
tot=a[i];
cnt++;
}if(tot>0)
cnt++;
if(cnt<=m)
return 1;
else
return 0;
}int main()
l=ll;r=rr;
while(lprintf("%d",l);
return 0;
}
洛谷 P1182 數列分段
這是一道典型的二分答案問題 最大值最小,最小值最大 關鍵是對於細節的處理。二分的框架 l max,r sum while l r else l m 1 cout 二分的框架是普遍使用的,關鍵是檢驗函式的設計,此處的檢驗函式的含義為 是否存在一種合法的劃分,使得每段的最大值都不大於m。設計好了檢驗函式...
洛谷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...