题解
2025-02-08 16:56:08
发布于:上海
15阅读
0回复
0点赞
*经典的二分答案题目
题目大意:
n根原木,切割成k段长度均为l的小段木头,希望求出l的最大值
解题思路:
使用二分
*二分查找:适用于有序数组或具有单调性质的问题,通过不断缩小查找范围,可以在对数时间内找到满足条件的最大值或最小值。(来源:AC助手)
*二分查找基于二分答案之上加以判断(函数)
这里查找长度l
左端点=1,右端点=n根原木中最长的那根
如果没有接触过二分,建议先去做:
A8019.查找x**:https://www.acgo.cn/problemset/info/8019
A8023.烦恼的高考志愿:https://www.acgo.cn/problemset/info/8023
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[100005];
bool f(int x){
int answer=0;//统计能切出多少段
for(int i=1;i<=n;i++){
answer+=a[i]/x;
}
if(answer>=k)return 1;
else return 0;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int mi=0;
for(int i=1;i<=n;i++){
mi=max(mi,a[i]);
}
int left=1;
int right=mi;
int ans=0;
while(left<=right){
//二分有很多种不同的形式,这里使用的是左闭右闭[](根据两端是否符合条件而定)
int mid=(left+right)/2;
if(f(mid)){
ans=mid;
left=mid+1;
//如果这里的mid(作为l)可行,继续寻找更大的l(改变区间,左端点增大,在[mid+1,right]之间找l)
}else right=mid-1;//否则右端点减小,在[left,mid-1]之间找
}
cout<<ans;
}
这里空空如也
有帮助,赞一个