题意:有n件衣服,每件衣服含水量为num[i],自然条件下每分钟每件衣服含水量减1,如果使用烘干机烘干一件衣服,则该件衣服每分钟含水量减k(每次只能烘干一件衣服),求最少需要多久才能将每件衣服晾干(含水量为=0)。
解法:二分搜索;因为答案具有单调性,一定存在这样一个天数,大于等于此天数一定都可以,小于则都不可以。计算某一天数t满足时就贪心算每个衣服要在此天数内晾干至少需要烘干几天,然后将所有的衣服需要烘干的天数加起来,小于等于t时t就是足够的了;
代码:
/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
#define eps 1e-8
typedef long long LL;
int num[100100];
int n;
char s[100];
int k=0;
bool compute(int t)
{
LL ans=0;
for(int i=0;i<n;i++)
{
if(num[i]<=t)continue;
ans+=(num[i]-t)/(k-1);
if((num[i]-t)%(k-1)>0)
ans++;
if(ans>t)
return false;
}
return true;
}
int main()
{
while(scanf("%d",&n)==1)
{
int ma=0;
for(int i=0;i<n;i++)
scanf("%d",num+i),ma=max(ma,num[i]);
scanf("%d",&k);
if(k<=1)
{
printf("%d\n",ma);
continue;
}
int left=0,right=ma;
while(left<=right)
{
int middle=(left+right)/2;
if(compute(middle))
right=middle-1;
else
left=middle+1;
}
cout<<left<<'\n';
}
return 0;
}