1. 程式人生 > >POJ 3104 Drying 二分

POJ 3104 Drying 二分

題意

給定n件衣服,每件衣服都有一定的溼度,有兩種讓衣服 變幹 的方法,一種是自然晾乾,每分鐘減少一個溼度
(不在暖氣上的衣服),另一種是用暖氣片,每分鐘減少k個溼度(暖氣片上一次只能放一件衣服且在暖氣片上時這件衣服沒有自然晾乾)。輸出晾乾所有衣服的最小時間。

思路

對時間進行二分,若一件衣服的水量大於mid,則一件衣服的最短時間是烘乾一段時間,在自己蒸發一段時間。可以算出烘乾的時間,(假設用了 t 時間的暖氣片)為k*t+(mid-t)>=a[i]  ,  t=(a[i] - mid) / (k - 1)。這樣把所有衣服的時間加起來,判斷可行即可。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=100010;
typedef long long ll;
ll a[maxn];
int main()
{
    int n;
    ll k,l,r;
    while(~scanf("%d",&n))
    {
        l=r=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
            r=max(r,a[i]);
        }
        scanf("%lld",&k);
        if(k==1)
        {
            printf("%lld\n",r);
            continue;
        }
        ll mid,t,sum;
        while(l<=r)   //對時間進行二分
        {
            t=0;
            mid=(l+r)>>1;
            for(int i=0;i<n;i++)
            {
                if(a[i]>mid)
                {
                    t += (ll)(ceil( (a[i]-mid)*1.0/(k-1) ));
                }
            }
            if(t<=mid)
            {
                sum=mid;
                r=mid-1;
            }
            else
            {
                l=mid+1;
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}