题意:
有n件衣服,每件衣服都有ai点水份。现在你可以自然烘干衣服每一分钟减少1点水份,或者你可以选择烘干机,每次烘干k水份,
问你最少需要多少时间可以把所有衣服烘干
解析:
二分枚举答案
假设一件衣服烘干需要x分钟,烘干机用了y分钟,那么自然干需要x-y分钟
所以: (x-y)+y*k>=a[i]
那么: y>=(a[i]-x)/(k-1)
假设二分答案为x分钟
那么对于<x分钟的都可以置为0,因为他们在x分钟内已经可以自然风干了
然后计算y即可,根据y值调动上下限
注意的是当k==1的时候,只要选择最大即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10000;
ll a[N],k;
ll b[N];
int n,tot;
bool check(ll x)
{
ll ans=0;
for(int i=1;i<=n;i++) b[i]=a[i]-x;
for(int i=1;i<=n;i++)
{
if(b[i]>0)
{
ans=ans+b[i]/(k-1)+(b[i]%(k-1));
}
}
if(ans>x) return true;
return false;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
scanf("%lld",&k);
sort(a+1,a+1+n);
if(k==1)
{
cout<<a[n]<<endl;
continue;
}
ll l=1,r=1e18;
ll ans;
while(l<=r)
{
ll mid=l+r>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
// printf("sample output #%d\n",++tot);
cout<<l<<endl<<endl;
}
}