题目链接:https://ac.nowcoder.com/acm/problem/235254
代码参考:https://blog.csdn.net/m0_60531106/article/details/125902400
对k - 1还是有点不太理解,以后再看
#include<bits/stdc++.h>
using namespace std;
/*
* NC235254 晾衣服
https://ac.nowcoder.com/acm/problem/235254
*/
long long n, k;
const int SIZE = 100000 + 10;
int max_num;
int a[SIZE];
int judge(long long x)
{
long long total = 0;
for (int i = 0; i < n; i++)
{
if (a[i] > x)//需要烘干
total += (ceil((a[i] - x) * 1.0 / (k - 1)));//烘干机每分钟能额外减少k-1水分
//因为在最开始求是否存在自然干的衣服时,已经将所有的衣服都在该分钟内的水量减去了1,所以这是再算吹风机的效果时,再减去k-1即可
}
return total <= x;//true:烘干机使用时间比总时间小,x偏大
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
max_num = *max_element(a, a + n);
scanf("%d", &k);
if (k == 1)
{
//避免除0错误
cout << max_num << endl;
return 0;
}
long long l = 1, r = max_num;
while (l <= r)
{
long long mid = (r + l) >>1;
if (judge(mid)) r = mid - 1;
else l = mid + 1;
}
cout << r + 1 << endl;
return 0;
}