對於給定的乙個長度為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_iai,含義如題目所述。
輸出格式:
乙個正整數,即每段和最大值最小為多少。
輸入樣例#1:複製
5 3輸出樣例#1:複製4 2 4 5 1
6對於20\%20%的資料,有n≤10n≤10;
對於40\%40%的資料,有n≤1000n≤1000;
對於100\%100%的資料,有n≤100000,m≤n, a_in≤100000,m≤n,ai之和不超過10^9109。
因為求最大值的最小化 如果符合判斷條件那麼 就應該往左邊找,不符合就往右邊找,正好和最小值的最大化相反(如果符合條件那麼就是在右邊找)
#include#include#include#include#include#includeusing namespace std;
typedef long long int ll;
int n, m;
const int n = 1e5 + 10;
int s[n];
bool check(int x)
else sum += s[i];
} if (num >= m) return false;
return true;
}int main()
int ans=0;
int right = sum;
int left = maxn;
while (left <= right)
else left = mid + 1;
} printf("%d\n", ans);
return 0;
}
P1182 數列分段Section II
二分答案 確定左邊界和右邊界後找中間值,驗證該值是不是不滿足 要找到滿足中最小的那個 不如說是找到不能滿足的最大的那個 1 主要是怎麼寫好judge函式。將數列在保證分段和不超過mid的情況下 盡可能使得段數最少 如果最少段數超過了m,說明滿足最大值最小的 ans 一定比該二分答案大,也就是說mid...
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。...