P1182 數列分段Section II

2021-08-17 05:55:15 字數 602 閱讀 4462

二分答案

確定左邊界和右邊界後找中間值,驗證該值是不是不滿足

要找到滿足中最小的那個(不如說是找到不能滿足的最大的那個+1)

主要是怎麼寫好judge函式。

將數列在保證分段和不超過mid的情況下 盡可能使得段數最少

如果最少段數超過了m,說明滿足最大值最小的(ans)一定比該二分答案大,也就是說mid不滿足轉而找右邊的二分點

如果沒超過m,說明最大值最小的(ans)小於或等於mid,也就是說mid可能是最終答案,然後再找左邊的mid

直到找到最終答案為止。 

判斷的時候可以用字首和 

#include#include#includeusing namespace std;

int a[100010];

int n,m,l=0,r=0,ans;

bool judge(int x)

} return tot<=m;

}int main()

while(l<=r)

else

l=mid+1;

} printf("%d",ans);

return 0;

}

P1182 數列分段 Section II

對於給定的乙個長度為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,和最...

P1182 數列分段 Section II

求最小值的最大,最大值的最小,考慮二分 對於給定的乙個長度為n的正整數數列a i,現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。輸入格式 第1行包含兩個正整數n,m。第2行包含nn個空格隔開的非負整數a,含義如題目所述。輸出格式 乙個正整數,即每段和最大值最小為多少。輸入樣例 1...

P1182 數列分段 Section II

對於給定的乙個長度為n的正整數數列a ia i,現要將其分成m m n m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4245142451要分成33段 將其如下分段 42 45 1 42 45 1 第一段和為66,第22段和為99,第33段和為11,和最大值為99。...