#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
ll n, k;
ll a[200000];
bool dix(int mid)//枚举的是自然风干时间
{
ll time = 0;
if(k == 1) return true;
for(int i = 0; i < n; i++){
if(a[i] > mid) //枚举自然风干时间
time += (a[i] - mid + k - 2)/ (k - 1);// 设这机洗时间与自然风干时间两段时间分别是x1和x2,那么有mid=x1+x2,ai<=k*x1+x2则x1 >= (a[i]-x2)/k
}
if(time > mid) return true;//所以但凡机洗总时间大于自然风干说明自然风干时间小了则左区间要变大
return false;//若机器洗时间小于自然风干时间说明自然风干时间大了有区间要变小
}
int main()
{
while(scanf("%lld", &n) != EOF){
ll maxn = 0;
for(int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
if(maxn < a[i]) maxn = a[i];
}
scanf("%lld", &k);
ll mid, left = 0, right = maxn;
while(left < right - 1){
mid = (left + right)/2;
if(dix(mid)){
left = mid;
}
else
right = mid;
}
printf("%lld\n", right);//输出最小
}
return 0;
}
poj3104(二分)
最新推荐文章于 2024-01-26 10:45:11 发布