题目
思路:
二分法查找答案->满足条件->缩小范围->最优值
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[100001];
long long n,c,t,maxx;
int Find(int l, int r)
{
while(l<=r)
{
long long mid=(l+r)/2;
long long can=mid*t;
long long now=0,ans=1;
for(int i=1; i<=n;i++)//自己想出来的方法
{
if(a[i]>can){ans=c+1;break;}//结束条件
now+=a[i];
if(now>can){ans++;now=0;i=i-1;}
}
if(ans<=c) {r=mid-1;maxx=mid;}//ans代表人数
else l=mid+1;
}
return maxx;
}
int main()
{
long long sum=0;
cin>>n>>c>>t;
for(int i=1; i<=n; i++)
{
cin>>a[i];
sum+=a[i];
}
long long x=Find(1,1e9);//可以用1e9,二分法快
cout<<x<<endl;
return 0;
}