题目链接:http://poj.org/problem?id=3104
这个题目第一眼看到以为又是什么贪心或者DP呢,其实二分枚举就能搞定,这个题目除了long long要注意以外没发现什么陷阱
至于二分枚举这个想法其实不难想到,关键就是怎么判断时间为time的时候是否能全部晾干,其实也简单,可以这样贪心的想,
把这time时间全部用来烘干,能晾干的自己晾干,那么每个都让自己晾的时间为time,那么剩下的就由自己烘干机来搞定了,
这里只要判断是否能在时间time内烘干所有衣服就行了,复杂度N*(logN)
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define maxn 110000
#define LL long long
LL n,k,rec[maxn];
bool is_ok(int time){
int i,temp,t=time;
double te;
for(i=0;i<n;i++){
temp=rec[i]-time;
if(temp <= 0) continue;
else{
te=double(temp)/k;
if(te-int(te)>0)
t-=int(te)+1;
else t-=int(te);
}
if(t < 0)
return false;
}
return true;
}
LL solve(){
LL ans=100000000000+1;
int l=0,r=ans,mid;
while(l <= r){
mid=(l+r)>>1;
if(is_ok(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}
char str[100];
int main(){
int i,j,m;
while(scanf("%lld",&n)!=EOF){
m=0;
for(i=0;i<n;i++)
{scanf("%lld",&rec[i]); if(m<rec[i]) m=rec[i];}
scanf("%lld",&k);
k--;
if(k<=0){ k=0; printf("%d\n",m);continue;}
solve();
}
return 0;
}