poj 3104 Drying 二分答案

来源:互联网 发布:json key value 数组 编辑:程序博客网 时间:2024/05/18 03:08

时空隧道


题目大意:
有n件衣服,每件衣服有一个湿度值a[i],每个单位时间每件衣服可以自然蒸发一点湿度值,现在有一台烘干机,每个单位时间可以使一件衣服减少k点湿度值(烘干期间不会自然蒸发),最少需要多长时间可以使得所有衣服都干掉


分析:
二分答案
为什么这道题要使用二分?
首先这道题是一个最优值问题,也就是最大值最小的问题
其次答案是单调的,满足二分性质
所以此题可以转化为二分答案判断可行性的问题
对于ans,如果a[i]<=ans,那么就让i自然蒸发,否则就要使用ceil(a[i]-ans])/(k-1)时间的烘干机,判断使用烘干机的时间是否满足ans


代码如下:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#define int long longusing namespace std;const int maxn=100000+5;int n,a[maxn],k,mx=0;inline bool check(int tim){    int cnt=0;    for(int i=1;i<=n;i++)        if(a[i]>tim)            cnt+=(a[i]-tim+k-1)/k;    if(cnt>tim)        return false;    return true;}signed main(void){    scanf("%lld",&n);    for(int i=1;i<=n;i++)        scanf("%lld",&a[i]),mx=max(mx,a[i]);    scanf("%lld",&k);    k--;    if(k==0){        cout<<mx<<endl;        return 0;    }    int l=0,r=mx,ans;    while(l<=r){        int mid=(l+r)>>1;        if(check(mid))            ans=mid,r=mid-1;        else            l=mid+1;    }    cout<<ans<<endl;    return 0;} 

by >_< neighthorn

1 0
原创粉丝点击