您的位置:首页 > 其它

poj 3104(二分,注意int类型的取值范围)

2011-06-05 19:18 169 查看
在0和最大值之间二分查找时间,因为数据太多了,必须二分来求。。。。。。在二分的时候如果是int类型的变量,会让mid=(left+right)/2;时超出int范围,所以需要用64位的变量来写。。。

 

#include <iostream>
#include<cstdio>
using namespace std;
int a[100010];
int main()
{
int n,k,i,maxw=-1;
while(scanf("%d",&n)!=-1){
maxw=-1;
for(i=0; i<n; i++){
scanf("%d",&a[i]);
if(a[i]>maxw)
maxw=a[i];
}
scanf("%d",&k);
if(k==1){
printf("%d/n",maxw); continue;
}
else{
long long l=0,r=maxw,mid,sum=0;
while(l<=r){
mid=((l+r)>>1);
sum=0;
for(i=0; i<n; i++)
if(a[i]>mid){
sum+=((a[i]-mid)/(k-1));
if((a[i]-mid)%(k-1)!=0)
sum++;
}
if(sum>mid) l=mid+1;
else r=mid-1;
}
printf("%lld/n",l);
}
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐