题面:
题目链接
思路:
太久没做题了,手有点生,题目的意思是求最大值的最小值
所以考虑二分答案
代码:
#include
using namespace std;
const int maxn=1e5+11;
int n,k;
long long a[maxn],cnt[maxn],maxx;
bool check(long long x)
{
int temp=1,j=0;
for(int i=1;i<=n;i++)
{
if(cnt[i+1]-cnt[j]>x)
{
temp++;
j=i;
}
}
//cout<<"x="<
if(temp>k) return 0;
else return 1;
}
void erfen()
{
long long l=maxx,r=cnt[n];
while(l<r)
{
//cout<<"l="<
long long mid=(l+r)>>1;
if(!check(mid)) l=mid+1;
else r=mid;
}
//cout<<"l="<
cout<<r<<endl;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]*=a[i];
maxx=max(maxx,a[i]);
}
for(int i=1;i<=n;i++)
{
cnt[i]=cnt[i-1]+a[i];
}
erfen();
return 0;
}