采用二分验证的方式,
验证:先假设没有烘***,那么t分钟过后每件衣服就消耗了t个水分。这时候在使用烘***的话就水每分钟消耗n-1个水分,那么每一件衣服还需要使用多少次烘***就可以计算出来。
然后一共可以使用t次烘***,进行比较即可得到。要注意在计算过程中次数可能超出int的范围,需要开long long。
//采用二分验证的方式,
//验证:已知时间,散热器的K,那么就可以算出最大能烘干最大的水分。通过最大水分就可以判断是当前的答案合不合理
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 1e5+10;
int n, k;
int a[maxn];
bool yanz(int x)
{
int b[maxn];
memcpy(b, a, sizeof(a));
ll ci = 0;
for (int i=0;i<n;i++) {
b[i] -= x;
if (b[i]>0) {
ci += ceil((double)b[i]/(k-1));
}
}
return ci<=x;
}
int main()
{
scanf("%d", &n);
int maxval = INT_MIN;
for (int i=0;i<n;i++) {
scanf("%d", &a[i]);
if (maxval<a[i]) maxval = a[i];
}
scanf("%d", &k);
if (k<=1) {
cout<<maxval;
return 0;
}
int l = 1, r = 1e9+10;
while (l<r) {
// cout<<l<<" "<<r<<endl;
int mid = (l+r)/2;
if (yanz(mid)) r = mid;
else l = mid+1;
}
// cout<<yanz(1)<<endl;
printf("%d", l);
}

京公网安备 11010502036488号