您的位置:首页 > 其它

poj3104(二分)

2017-04-16 17:00 204 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: