POJ-3104 Drying(二分

题目链接:http://poj.org/problem?id=3104

题意:你有n件衣服需要烘干,每件衣服给出湿度。你现在有一个烘干机,每次可以烘干k点湿度,求输出烘干所有衣服所需最少的时间。

思路:二分最少时间,如果当前衣服大于时间,我们考虑使用烘干机,求出所有衣服烘干所需时间,如果<=mid 我们保存mid,继续往更少的时间二分即可

#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = 100005;
ll a[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        ll Max=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%lld",&a[i]);
            Max=a[i]>Max?a[i]:Max;
        }
        ll k;
        scanf("%lld",&k);
        if(k==1)
        {
            printf("%d\n",Max);
            continue;
        }
        ll l=1;
        ll r=Max;
        ll ans=0;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            ll sum=0;
            for(int i=1; i<=n; i++)
            {
                if(a[i]>mid)
                {
                    ll xx=ceil((a[i]-mid)*1.0/(k-1));
                    sum+=xx;
                }
            }
            if(sum<=mid)
            {
                ans=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        cout<<ans<<endl;
    }
}
View Code

 

 

 

 

 

PS:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~
posted @ 2018-12-09 21:05  MengX  阅读(134)  评论(0编辑  收藏  举报

梦想不是空想