https://www.luogu.org/problemnew/show/P1182
做了这个题才知道二分的强大
这个题可以假设我们有n个果子 m个容器 要能把果子全装进去 那么容器最小可以是多小
很显然 如果我们的容器每一个都能把全部的果子装进去 那么一定是一种可行的解 但不是最优的
容器最小是多小呢?至少要能装得下最大的果子
所以答案就在 maxAi 和 sumAi 之间 进行二分查找即可
如果当前的mid是容器的容量,求出来需要多少容器 如果比 m 多 那么说明 mid 太小了 如果小于等于 m 那么就看看还有没有可以更小一点的容量
#include<bits/stdc++.h> using namespace std; int n,m,a[100005]; void erfen(int l,int r) { int i; if(l>=r) { cout<<l<<endl; exit(0); } int mid=(r+l)/2; int sumn=0; int k=1; for(i=0;i<n;i++) { sumn+=a[i]; if(sumn>mid) { sumn=a[i]; k++; if(k>m) break; } } if(k>m) { erfen(mid+1,r); } else { erfen(l,mid); } } int main() { int i,maxn=0,sumn=0; cin>>n>>m; for(i=0;i<n;i++) { cin>>a[i]; maxn=max(a[i],maxn); sumn+=a[i]; } erfen(maxn,sumn); }