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