要把n个数分成m份,使得得到的m份中的最大值尽可能的小;
二分:其上界r是n个数的和(相当于把n个数分成1份),下界l是n个数中的最大值,那么取mid=(l+r)/2,进行二分;用tp计数mid遍历n个数后,大于sum的值。具体的代码:
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<cmath> #include<queue> using namespace std; #define sf scanf #define pf printf #define INF 1<<29 #define eps 1e-6 const double PI=acos(-1.0); #define lint __int64 #define LL long long #define ULLint unsigned long long //2^64-1>1.8*10^19 #define clr(x) memset(x,0,sizeof(x)) #define Clr(x) memset(x,-1,sizeof(x)) int sum=0,n,m,a[100001],i,l=0,r,mid,tp=1; int main(){ while(EOF!=sf("%d %d",&n,&m)){ for(i=1;i<=n;i++){ sf("%d",&a[i]); l=a[i]>l?a[i]:l; sum+=a[i]; } r=sum; while(l<r){ sum=0; mid=(r+l)/2; tp=1; for(i=1;i<=n;i++){ sum+=a[i]; if(sum>mid){ sum=a[i]; tp++; } } if(tp>m) l=mid+1; else r=mid-1; } pf("%d\n",l); } return 0; }