poj 3104 Drying (二分搜索答案)

题目:http://poj.org/problem?id=3104

思路:二分一个答案,然后判断可行性,注意这题整形用long long , 另外算中值的时候:

  mid = lhs+ (rhs-lhs)>>1 这种会超时,如果改成 mid= (lhs+rhs)>>1就不超时了,想不通,

按理说第一种会避免中间值溢出,同样是位操作,怎么第一种会超时呢?有大神路过,求指教:

代码:

#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN=100005;
long long N,K,a[MAXN];
bool can(long long mid)    
{
	long long sum=0;
	for(int i=0;i<N;i++){
		if(a[i]<=mid) continue;
		long long left=a[i]-mid+K-2;
		sum+= left/(K-1);
	}
	
	if(sum<=mid) return 1;
	else return 0;
}
int main()
{
	while(cin>>N)
	{
		long long lhs=0,rhs=0;
		for(int i=0;i<N;i++)
		{
			scanf("%d",&a[i]);
			rhs=max(rhs,a[i]); //shang届 
		}
		cin>>K;
		if(K==1){
			cout<<rhs<<endl;
			continue; 
		}
		while(lhs<rhs)
		{
			long long mid=(rhs+lhs)>>1;
			if(can(mid))rhs=mid;
			else lhs=mid+1;
		}
		cout<<lhs<<endl; 
	}
	return 0;
}


你可能感兴趣的:(二分搜索)