#E. NH.2023.小甲.05.文本框
题目描述
小慧把她学会的英文单词记录了下来,现在她希望在一个文本框里完全显示出她记录的单词库。已知这个文本框最多只能显示 MM 行,小慧的单词库有 NN 个单词,要求按原次序显示所有单词,每个单词至少要用一个空格分开,而且一个单词的所有字母必须放在同一行。问这个文本框至少需要多宽才能满足小慧的需求。
输入格式
第一行,两个正整数 N,MN,M。
第二行,NN 个正整数,表示每个单词的长度。
输出格式
能把所有单词显示出来的文本框的最少宽度。
样例
输入数据 1
13 3
9 5 2 7 1 8 8 2 1 5 2 3 6
Copy
输出数据 1
26
Copy
输入数据 2
30 8
8 55 26 97 48 37 47 35 55 5 17 62 2 60 23 99 73 34 75 7 46 82 84 29 41 32 31 52 32 60
Copy
输出数据 2
189
Copy
数据范围
对于 40% 的数据,1 \le N,M \le 10^31≤N,M≤103,每个单词的长度 \le 10^2≤102。
对于 100% 的数据,1 \le N,M \le 2*10^51≤N,M≤2∗105,每个单词的长度 \le 10^9≤109。
上一篇也是这个,不会以为没了把?
//钵钵鸡之王专属水印
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[10000005];
bool ok(long long x){
long long s=1;
long long q=0;
for(int i=1;i<=n;i++){
if(a[i]-1>x){
return 0;
}
if(q+a[i]-1>x){
s++;
q=0;
}
q+=a[i];
}
if(q>x)s++;
return s<=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]++;
}
long long l=0,r=1e12;
while(l+1<r){
long long mid=(l+r)/2;
if(ok(mid))r=mid;
else l=mid;
}
cout<<r;
return 0;
}
呵呵,金色传说!!!