POJ ~ 3104 ~ Drying (二分)

题意:先输入N表示现在要烘干N件衣服,然后输入这N件衣服的含水量。每件衣服的含水量每分钟会减少1,当含水量为0时表示这个衣服干了。现在还有一个烘干机,烘干机上可以放一件衣服,烘干机每分钟可以使该衣服的含水量减少k。问最少需要多长时间可以把所有衣服都弄干?

思路:二分最短时间t,如果a[i] <= t 说明不需要对他进行烘干操作,如过a[i] > t那么我们需要用烘干机对他烘干(t-a[i])/(k-1)次,注意向上取整。为什么是k-1呢,因为在烘干的时候他每分钟减少k,而原来每分钟减少了1,用烘干机的时候比原来每分钟多减少了k-1。

对于ai这个衣服,假设能在mid分钟内处理完,设需要用x分钟的机器,那么自然风干需要mid – x分钟,x和mid需要满足:

k*x + (mid – x) >= a_i,即 x >= (a_i – mid) / (k – 1)。

注意开long long

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN = 1e6 + 5;
long long n, k, a[MAXN];
bool judge(long long mid)
{
    long long cnt = 0;
    for (int i = 0; i < n; i++)
        if (a[i] > mid) cnt += ceil((double)(a[i] - mid) / (double)(k - 1));
    if (cnt <= mid) return true;
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    while (~scanf("%lld", &n))
    {
        long long MAX = -1;
        for (int i = 0; i < n; i++)
        {
            scanf("%lld", &a[i]);
            MAX = max(MAX, a[i]);
        }
        scanf("%lld", &k);
        if (k == 1) { printf("%lld\n", MAX); continue; }
        long long l = 0, r = MAX, mid = l + (r - l) / 2, ans;
        while (l <= r)
        {
            if (judge(mid)) ans = mid, r = mid - 1;
            else l = mid + 1;
            mid = l + (r - l) / 2;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
/*
3
2 3 9
5
3
2 3 6
5
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值