您的位置:首页 > 其它

2016寒假训练——二分

2016-02-22 16:08 197 查看
来源: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;
}
欢迎各位看官大牛点评。橙子在这谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: