在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; }