#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<stdio.h>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
long long int p[100050];
long long int n,k,maxx=0;
bool judge(long long int tot)
{
long long int sum=0;
for(int i=0;i<n;i++)
{
if(p[i]>tot)
{
sum+=(ceil)((p[i]-tot)*1.0/(k-1));
}
}
if(sum<=tot)
return 1;
return 0;
}
int main()
{
while(~scanf("%lld",&n))
{ maxx=0;
for(int i=0;i<n;i++){
scanf("%lld",p+i);
if(p[i]>maxx)
maxx=p[i];
}
scanf("%lld",&k);
if(k==1)
{
printf("%lld\n",maxx);
continue;
}
long long int r,l,mid;
r=maxx,l=0;
while(l<r)
{
// printf("%lld\n",l);
mid=(l+r)/2;
if(judge(mid))
r=mid;
else
l=mid+1;
}
printf("%lld\n",r);
}
return 0;
}
这道题写的 有点怀疑人生,大概意思就是 有个人洗衣服 然后烘干机 一分钟能烘干 k水分 自然蒸发 可以 风干 1水分 问最短时间 能 使所有水分蒸发完 ,这道题 的思想如果找到的话 用代码很好实现 其实就是 设 用 烘干机 的 时间是 x 风干的时间是 y 最短时间是t 则有 x+y=t, 又因为 有 x*k+y>=p[i] 则 x>=p[i]/(k-1) 但是 又要选取最大的整数 所以 用了 ceil 然后 用二分 来找 时间 当 k==1的时候 要特判一下 这是我从网上 以及各位大牛的 博客 理解的 可能会有偏差 如果 有错 请指出 谢谢!