poj 3104 Drying (二分搜索答案)

来源:互联网 发布:excel数据如何恢复 编辑:程序博客网 时间:2024/05/01 00:11

题目: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;}


原创粉丝点击