来源:http://poj.org/problem?id=3104
POJ3104
用模拟会超时,所以考虑用二分节约时间
首先分析,实际上是每一次都是去烘干水量最大的,风干其他的,然后烘完再排序一下,重复这一操作,直到所有的都为1。当然,模拟显然是会超时的。所以我们这样考虑,我们这样考虑,如果对于一个时间t,我们的有一部分衣服就会自然风干,有一部分衣服需要自己来烘干,所以我们来二分列举时间。
这里有几个注意点(网上其他题解中提到的):
1.a/b向上取整有(a+b-1)/b;
2.注意k==1的情况
大概就是这样。。。
AC代码:(本人在VJ上做的这一题,不是在POJ,有人和我说可能有区别,这。。。就很尴尬了)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Maxn=100100;
int a[Maxn];
bool judge(int x,int n,int k){
int t=0;
for(int i=0;i<n;i++){
if(a[i]>x){
t+=(a[i]-x+k-2)/(k-1);
//这个地方就是用的那个技巧
//计算烘干a[i]的时间,并叠加
if(t>x)return false;//如果大于我假设的,就要判断为false
}
}
return true;
}
int main(){
int n,k;
long long ans=0,t;
while(scanf("%d",&n)!=EOF){
ans=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
sort(a,a+n);
if(k==1){
printf("%d\n",a[n-1]);
continue;
}//k==1的特殊处理
int l=1;
int r=a[n-1];
while(l<=r){
int mid=l+(r-l)/2;
int sum=0;
if(judge(mid,n,k)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
printf("%lld",ans);
}
return 0;
}
欢迎各位看官大牛点评。橙子在这谢谢!