题目大意:
给出n个数字,要求分成连续的m段,使每段的和的最大值最小
输入 #1
5 3
4 2 4 5 1
输出 #1
6
分析
算法:二分+贪心
这道题是要求出最大值的最小化所以想到用二分。
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],l,r,mid,ans;
bool check(int x){
int num=0,ans=0;
for(int i=1;i<=n;i++){
if(num+a[i]<=x){//贪心
num+=a[i];
}else{
num=a[i];
ans++;
}
}
return ans>=m;
}//把n个数分成m段,每组长度之和<=x,判断是否可行
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
l=max(l,a[i]);
r+=a[i];
}
while(l<=r){
mid=l+r>>1;
if(check(mid)){
l=mid+1;
}else{
r=mid-1;
}
}
cout<<l;
return 0;
}
该文介绍了一种编程问题,要求将给定的n个数字分成m段,目标是使得每段连续数字的和的最大值尽可能小。通过二分查找结合贪心策略,确定分割的临界点,以达到这一目标。程序中定义了检查函数check()来判断给定的分割条件是否可行,并在主函数中进行二分搜索找到最优解。
160

被折叠的 条评论
为什么被折叠?



