Drying POJ - 3104 二分

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
const int maxn = 1e5+10;
using namespace std;
long long k;
int n;
long long a[maxn];
long long ans=0;
long long maxt=0;
bool check(int mid)
{
	long long hott=0;
	for(int i=0; i<n; i++)
	{
		//如果小于等于mid,那么直接晾干就行,不占用烘干机 
		//如果大于 这个时候就用烘干机处理多出来的时间 
		if(a[i]>mid)
			hott+=(long long)ceil((double)(a[i]-mid*1.0)/(k-1));
		if(hott>mid)
			return false;
	}
	return true;
}
void solve()
{
	int l=1,r=a[n-1];
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid))
			r=mid;
		else  
			l=mid+1;
	}
	printf("%d\n",l);
}
int main()
{
	scanf("%d",&n);
	for(int i=0; i<n; i++)
		scanf("%lld",&a[i]);
	scanf("%d",&k);
	sort(a,a+n);
	if(k==1)
	{
		printf("%lld\n",a[n-1]);
		return 0;
	}
	solve();
	return 0;
}
posted @ 2020-05-07 00:48  晴屿  阅读(74)  评论(0编辑  收藏  举报