【二分法】木材加工(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;
}

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

猜你喜欢

转载自blog.csdn.net/melon_sama/article/details/108507392
今日推荐