马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int m,n;
const int N=2e5+10;
int a[N];
void putin()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
}
bool check(ll k)
{
ll res =1,cnt=0; //res表示行数
for(int i=0;i<n;i++)
{
if(a[i]>k)return 0; // 9 5 2 8 10 16 18
else if(a[i]+cnt+1<=k)cnt+=a[i]+1;
else if(cnt+a[i]<=k) res++,cnt=0; //表示到了26没有空格
else res++,cnt=a[i]+1;//表示这段放不下需要另外启动一行,
}
return res-(!cnt)<=m; //以res=1开始的,如果没有
}
void min()
{
ll l=0,r=1e15;
while(l<r)
{
ll mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<r<<endl;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
putin();
min();
}
为什么return res-(!cnt)<=m;为什么要减去取反的cnt呢 |