POJ-3104 Drying


题意:你有n件湿度为a[i]的衣服需要晾干,每件衣服每分钟可以蒸干1个湿度,烘干机每分钟可以烘干k个湿度,烘干时不计蒸干,烘干机每次只能烘干一件衣服,问把这n件衣服晾干所需的最少时间。

思路:二分结果。
            1.当k==1时,所需时间为n件衣服中湿度最大的值。
            2.当k>1时,二分所需时间,求出结果。
参考代码:
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define max(a,b) a>b?a:b
#define ll long long
#define inf 0x3f3f3f3f

using namespace std;
ll a[100010];
ll k,maxx;
int n;
bool check(ll x)
{
    ll ans=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]>x)//湿度>所需时间,用烘干机烘干
        {
            ll t=ceil((a[i]-x)*1.0/(k-1));//ceil()函数是求不小于给定实数的最小整数,如:ceil(2.3)=3
            ans+=t;
        }
    }
    if(ans<=x)
        return true;
    return false;
}
int main()
{
    while(~scanf("%d",&n))
    {
        maxx=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
            maxx=max(maxx,a[i]);
        }
        scanf("%lld",&k);
        if(k==1)
        {
            printf("%lld\n",maxx);
            continue;
        }
        ll L=1,R=maxx,mid=(L+R)/2;
        while(L<R)
        {
            if(check(mid))
                R=mid;
            else
                L=mid+1;
            mid=(L+R)/2;
        }
        printf("%lld\n",mid);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值