题目大意:有n件衣服,给定他们需要多少分钟会干,有一台烘干机,只能同时烘干一件衣服,使他变干的速度变成每分钟相当于自然晾干k分钟。
1<=n<=1e5,1<=ai<=1e9,1<=k<=1e9
思路:二分查找最小时间,左端点是1,右端点是数组中的最大值,每次枚举,遍历每一件衣服,先减去mid,即自然烘干所用的时间,如果还有剩余,就除以(k-1),因为之前减过了自然烘干的时间,所以k要-1,然后得到需要的总时间,再与预定时间mid作比较
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
long long n,k;
long long a[100005];
bool check(long long x)
{
long long cnt = 0;
for (int i = 1; i <=n ; i++)
{
if (x < a[i])//x大于晾干需要的时间时,自然烘干即可
{
cnt += ceil((a[i] - x)*1.0 / (k - 1));//求出需要用多长时间的烘干机(向上取整)
}
}
return cnt <= x;
}
int main()
{
long long r,l=1,mid,ans=0;
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%lld",&a[i]);
}
cin >> k;
sort(a + 1, a + n + 1);
r = a[n];
if (k == 1)
{
cout << r<<endl;
}
else
{
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid))//如果实际时间小于等于假定的最小时间,说明还可以增大假定时间
{
r = mid - 1;
ans = mid;
}
else
{
l = mid +1;
}
}
cout << ans << endl;
}
return 0;
}