Drying POJ - 3104 二分 http://poj.org/problem?id=3104
二分查找作用之一:查找结果,逆向求解。
最让HSQ学长头疼的就是洗衣服了。洗完之后,每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分。令人遗憾是HSQ所在的宿舍楼只有1台烘干机,而每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?
输入
第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9
输出
输出烘干N件衣服所需要的最短时间
样例输入
3 2 3 9 5 3 2 3 6 5
样例输出
3 2
#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
const int inf=0x3f3f3f3f;
long long zu[100005];
int main()
{
int n;
long long maxnum=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&zu[i]);
maxnum=max(maxnum,zu[i]);
}
long long k;
scanf("%lld",&k);
if(k==1)
printf("%lld\n",maxnum);
else{
long long left=1,right=maxnum,bet;
while(left<right){ //二分查找 bet为所需时间 sum为烘干机使用总时间
bet=(left+right)/2;
long long sum=0;
for(int i=0;i<n;i++){
if(zu[i]>bet){
long long time=(zu[i]-bet)/(k-1);
if((zu[i]-bet)%(k-1))
time++;
sum+=time;
}
}
if(sum>bet)
left=bet+1;
else if(sum<bet)
right=bet;
else
break;
}
printf("%lld\n",(left+right)/2);
}
return 0;
}