分析:这个题要求最大值最小,且答案区间和的上限具有单调性,所以依然是一道二分答案的题,判断答案依然用到贪心算法
答案的最小值即最小上限时序列中最大的那个数字,最大值是序列和。
如果答案合法,就找寻更小的答案,如果答案不合法,就找寻更大的答案。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define maxn 100005 using namespace std; int num[maxn],n,m; inline bool check(int d) { int cnt=0,sum=0; for(int i=1;i<=n;i++) if(sum+num[i]<=d) sum+=num[i]; else sum=num[i],cnt++; if(cnt>=m) return false; else return true; } int main() { scanf("%d%d",&n,&m); int l=0,r=0; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); r+=num[i]; l=max(l,num[i]); } while(l<=r) { int mid=(l+r)>>1; if(check(mid)) r=mid-1; else l=mid+1; } printf("%d\n",l); return 0; }