代碼如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
int w[maxn],n,k;
bool judge(int mid)
{
int tol=0;
for(int i=0;i<n;i++)
{
if(w[i]-mid>0)
{
if(k==1) tol+=(w[i]-tol);
else
{
if((w[i]-mid)%(k-1)) tol+=(w[i]-mid)/(k-1)+1;
else tol+=(w[i]-mid)/(k-1);
}
}
if(tol>mid) return false;
}
return true;
}
int main()
{
scanf("%d",&n);
int mmax=-1;
for(int i=0;i<n;i++)
{
scanf("%d",w+i);
mmax=max(mmax,w[i]);
}
scanf("%d",&k);
sort(w,w+n,greater<int>());
int l=0,r=mmax*2,ans=l+(r-l)/2;
while(r-l>1)
{
int mid=l+(r-l)/2;
if(judge(mid))
{
ans=mid;
r=mid;
}
else l=mid;
}
cout << ans << endl;
return 0;
}