题目链接:openjudge-4135——Monthly Expense
题意:给定n,m,让你将n个数重新划分成m个数,而且是连续才能划分到一起,划分后的值为之前的这些数的和,然后目标是让重新划分后的这些值中最大的那个最小化。
思路:二分,最大值最小化
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int mx = 1e5+5;
int a[mx];
bool check(int p,int n,int m){
int cnt = 1, sum = 0;
for(int i = 0; i<n; i++){
if(sum + a[i]<=p)
sum += a[i];
else if(a[i] <=p){
sum = a[i], cnt++;
}
else return false;
}
if(cnt<=m)return true;
return false;
}
int main()
{
int n,m,left = 0,right=0;
cin>>n>>m;
for(int i = 0; i<n; i++){
cin>>a[i]; right+=a[i];
}
while(left<right){
int mid = (left+right)/2;
if(check(mid,n,m)) right = mid;
else left = mid + 1;
}
printf("%d\n",left);
return 0;
}