题目描述
某星球发生灾难,他们需要乘坐飞船逃离该星球,该星球有N个居民,已经排好队,要求按照队伍的顺序登船,飞船只能飞行M趟,为了控制成本,需要将飞船的承重设计的尽可能的小;给定N个居民的体重,求飞船的承重。
输入格式
第一行两个整数N和M,意义如题所述;
第二行,N个整数,表示居民的体重,
输出格式
一个整数,意义如题所述。
输入输出样例
输入样例1:
8 3
40 30 50 80 100 120 40 60
输出样例1:
220
说明
数据范围1<=N<=1000000;1<=M<=100000;
【解析】
此题关键字 “尽可能” 就要想到二分答案。
确定二分的范围。
这道题是求飞船的承重,最小是0,最大承重自己设置大一点。在这个区间进行二分。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,L,a[1000010],m;
bool check(ll mid){
ll cnt=1,sum=0;
for(int i=1;i<=n;i++){
if(a[i]>mid){
return false;
}
if(sum+a[i]>mid){
cnt++;
sum=a[i];
}else{
sum+=a[i];
}
}
return cnt<=m;
}
int main(){
ll l=0,r=1e15;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(l<r){
ll mid=(l+r)/2;
if(check(mid)){
r=mid;
}else{
l=mid+1;
}
}
cout<<l;
return 0;
}