Drying

直接上中文

Descriptions

每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台烘干机,每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?

输入

多组输入

第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K 
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9输出

输出

烘干N件衣服所需要的最短时间

样例输入

样例输出

题目链接

https://vjudge.net/problem/POJ-3104

二分的时间在算的时候首先减去这个时间作为自然风干,然后用烘干机的话每分钟就只能掉k-1的水(因为烘干的时候是不会自然风干的,然后需要特殊处理k=1的情况)

注意要用scanf printf 不然会超时

AC代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 100000+100
using namespace std;
int N,K;
ll l,r,mid;//左右中
ll a[Maxn];
ll ans;
int solve()
{
    mid=(l+r)/2;//预判时间
    ll cnt=0;//实际时间
    for(ll i=0; i<N; i++)
    {
        if(a[i]<=mid)//小于预判时间,即可以在规定时间内自然风干
            continue;
        else//需要借助烘干机
            cnt+=(a[i]-mid+K-2)/(K-1);//所需时间
        if(cnt>mid)//实际时间大于预判时间,失败
            return 0;
    }
    return 1;
}
int main()
{
    while(scanf("%d",&N)!=EOF)
    {
        l=0;//初始化
        r=0;
        for(ll i=0; i<N; i++)
        {
            scanf("%lld",&a[i]);
            r=max(r,a[i]);
        }
        scanf("%d",&K);
        if(K==1)//K==1,特殊处理
            cout<<r<<endl;
        else
        {
            ans=INF;//答案最小时间
            while(l<=r)
            {
                if(!solve())//失败,即预判时间小了,需要增大预判时间
                    l=mid+1;
                else//成功,减少预判时间,看是否有跟小的答案
                {
                    ans=min(mid,ans);
                    r=mid-1;
                }
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}
08-05 04:44