题意:先输入N表示现在要烘干N件衣服,然后输入这N件衣服的含水量。每件衣服的含水量每分钟会减少1,当含水量为0时表示这个衣服干了。现在还有一个烘干机,烘干机上可以放一件衣服,烘干机每分钟可以使该衣服的含水量减少k。问最少需要多长时间可以把所有衣服都弄干?
思路:二分最短时间t,如果a[i] <= t 说明不需要对他进行烘干操作,如过a[i] > t那么我们需要用烘干机对他烘干(t-a[i])/(k-1)次,注意向上取整。为什么是k-1呢,因为在烘干的时候他每分钟减少k,而原来每分钟减少了1,用烘干机的时候比原来每分钟多减少了k-1。
对于ai这个衣服,假设能在mid分钟内处理完,设需要用x分钟的机器,那么自然风干需要mid – x分钟,x和mid需要满足:
k*x + (mid – x) >= a_i,即 x >= (a_i – mid) / (k – 1)。
注意开long long
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN = 1e6 + 5;
long long n, k, a[MAXN];
bool judge(long long mid)
{
long long cnt = 0;
for (int i = 0; i < n; i++)
if (a[i] > mid) cnt += ceil((double)(a[i] - mid) / (double)(k - 1));
if (cnt <= mid) return true;
return false;
}
int main()
{
ios::sync_with_stdio(false);
while (~scanf("%lld", &n))
{
long long MAX = -1;
for (int i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
MAX = max(MAX, a[i]);
}
scanf("%lld", &k);
if (k == 1) { printf("%lld\n", MAX); continue; }
long long l = 0, r = MAX, mid = l + (r - l) / 2, ans;
while (l <= r)
{
if (judge(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
mid = l + (r - l) / 2;
}
printf("%lld\n", ans);
}
return 0;
}
/*
3
2 3 9
5
3
2 3 6
5
*/