题目
对于给定的一个长度为
N 的正整数数列
A[i]
,现要将其分成
M 段,并要求每段连续,且每段和的最大值最小。
关于最大值最小:
例如一数列 4 , 2 , 4 , 5 , 1 3 段
将其如下分段:[42],[45],[1]
第一段和为 6,第二段和为 9,第三段和为 1,和最大值为 9。
将其如下分段:
[4],[24],[51]
第一段和为 4 4,第二段和为 6 6,第三段和为 6 6,和最大值为 6 6。
并且无论如何分段,最大值不会小于 6 6。
所以可以得到要将数列 4 , 2 , 4 , 5 , 1 4,2,4,5,1 要分成 3 3 段,每段和的最大值最小为 6 6。
输入格式
第一行包含两个正整数
N,M。
第二行包含 N 个空格隔开的正整数 A [i],含义如题目所述。
输出格式
一个正整数,即每段和最大值最小为多少。
呆码
#include<bits/stdc++.h>
using namespace std;
long long n,a[999999],t;
bool check(long long x){
// int cnt = 0;
// int sum = 0;
// int tmp = 1;
// while(tmp<=n){
// while(cnt+a[++tmp]<=x)cnt+=a[tmp];
// cnt=0,sum++;
// }
// return sum == t;
}
int main(){
cin >> n >> t;
for(long long i=1;i<=n;++i){
cin >> a[i];
}
// sort(a+1,a+n+1);
long long l = 1,r=1e9,mid = 0,pos = 0;
while(l<=r){
mid= (r+l)/2;
// cout << mid << endl;
// r = mid-1;
if(check(mid)){
l = mid+1;
pos = mid;
}
else{
r = mid-1;
}
}
cout << pos+1;
return 0;
}
/*
class rule{
1.please WA!
2.don't TLE!
3.don't MLE!
4.don't CE!
5.don't RE!
6.don't UKE!
7.please AC!!!!!!
}
*/