【二分法】木材加工(Luogu P2440)

本文介绍了一种使用二分查找算法解决木材切割问题的方法,通过枚举木材的最长可能长度并使用二分法进行优化,避免了超时问题。代码实现包括输入输出、条件判断及特殊情况处理。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,k,s,maxx;
int a[100001];
bool pd(int x){
	ll p=0;
	for(ll i=0;i<n;i++)
			p+=a[i]/x;
		
		if(p>=k){
			return true;
		}
		else return false;
}

void search(ll l,ll r){
	ll mid=(l+r)/2;
	if(pd(mid)&&!pd(mid+1)) {cout<<mid;return;}
	
	if(pd(mid)) return search(mid,r);
	else return search(l,mid);
} 
int main(){
	cin>>n>>k;
	for(ll i=0;i<n;i++){scanf("%d",&a[i]);s+=a[i];}
	
	maxx=*max_element(a,a+n);
	
	if(k>s){
		cout<<0;
		return 0;
	}//special judge
	
	search(1,maxx);
	
	return 0;
}

分析:由条件,一个个枚举木材最长的长度会超时,因此想到使用二分法寻找,这题无论是边界还是递推公式的很好找(逃

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值