题解
2024-05-01 18:50:22
发布于:广东
33阅读
0回复
0点赞
服了两个WA害我耗费宝贵的一天一次获取测试点机会
还硬控我十分钟
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
int a[100005];
int n, m, ct;
bool check(int x){//正常check函数,用贪心求当最大值为x时最小分段数
int ct = 1, ctt = 0;
for(int i = 1; i <= n; i++){
if(a[i] > x) return 0;//注意如果a[i]>x说明不可能有这样的分段,返回0
ctt += a[i];
if(ctt > x){
ct++;
ctt = a[i];
}
}
return ct <= m;
}
signed main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
ct += a[i];
}int left = 1, right = ct;
while(left <= right){//二分模版
int mid = (left + right) / 2;
if(check(mid)) right = mid - 1;
else left = mid + 1;
}cout << left;
return 0;
}
时间复杂度:
这里空空如也
有帮助,赞一个