![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8abaa11d6d96e0a6e10e06015a3f4bf2.png)
题目分析:
- 二分最大值,贪心的选数,在一段未超过二分值得情况下尽可能的多取数
- 若不能再取,就重启一段,注意判断
a
[
i
]
>
m
i
d
a[i]>mid
a[i]>mid的情况
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
#define maxm 100010
int ans,l=888888,r=0,n,m,a[maxn];
inline void init_() {
freopen("a.txt","r",stdin);
}
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
inline bool judge_(int x) {
int maxd=0,tot=1;
for(int i=1;i<=n;++i) {
if( (maxd+a[i]) <= x) maxd+=a[i];
else {
++tot;
if(tot>m) return false;
maxd=a[i];
if(maxd>x) return false;
}
}
if(maxd<=x) return true;
else return false;
}
void readda_() {
n=read_();m=read_();
for(int i=1;i<=n;++i) {
a[i]=read_();
r+=a[i];
l=min(l,a[i]);
}
int mid;
while(l<=r) {
mid=(l+r)>>1;
if(judge_(mid)) {
r=mid-1;
ans=mid;
}
else l=mid+1;
}
printf("%d",ans);
}
int main() {
init_();
readda_();
return 0;
}