POJ - 3104

It is very hard to wash and especially to dry clothes in winter. But Jane is a very smart girl. She is not afraid of this boring process. Jane has decided to use a radiator to make drying faster. But the radiator is small, so it can hold only one thing at a time.

Jane wants to perform drying in the minimal possible time. She asked you to write a program that will calculate the minimal time for a given set of clothes.

There are n clothes Jane has just washed. Each of them took ai water during washing. Every minute the amount of water contained in each thing decreases by one (of course, only if the thing is not completely dry yet). When amount of water contained becomes zero the cloth becomes dry and is ready to be packed.

Every minute Jane can select one thing to dry on the radiator. The radiator is very hot, so the amount of water in this thing decreases by k this minute (but not less than zero — if the thing contains less than k water, the resulting amount of water will be zero).

The task is to minimize the total time of drying by means of using the radiator effectively. The drying process ends when all the clothes are dry.

Input

The first line contains a single integer n (1 ≤ n ≤ 100 000). The second line contains ai separated by spaces (1 ≤ ai ≤ 109). The third line contains k (1 ≤ k ≤ 109).

Output

Output a single integer — the minimal possible number of minutes required to dry all clothes.

Sample Input
sample input #1
3
2 3 9
5

sample input #2
3
2 3 6
5
Sample Output
 
sample output #13 sample output #22

对于这道题我内心是崩溃的,为啥都是二分,我的就T了,别人就过了?一定是这判题姬有毒。

回归正题:

           这题用二分暴力枚举就行了,题意就是n件衣服有1台烘干机,自然脱水每分钟1,用烘干机每分钟k(用烘干机就不用再加自然脱水的1)问最短时间把所有衣服全部烘干。
            直接二分枚举,假如x分钟,那么应有全部减去x,如果减不完,就看几个x-1可以整除它,也就是要烘干几次。这样二分找出最优解。

             比如以第一个样例为例子,l应该是1,r=9,pan=5,判断5是否符合答案要求,2 3 9在5分钟后变为0 0 4,每分钟可以用一次烘干机,烘干的值等于减去自然风干的1就是4,我有5次烘干机会很明显是可以全部烘干的,说明5符合条件,在二分找到3,同理3分钟可以把衣服全部烘干,在找2,两分钟无法把衣服烘干,答案就是3.

看了别人代码就把r=n改成了r=maxn(这里我是错了),然后把数据全开long long 就过了,题目数据不超long long呀!我又没有用乘法,一定是测评姬卡了,不然我的代码是不可能超时的。

  代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
long long a[100010];
long long n;
long long k,l,r,pan;
long long pding(long long an)//判断是否符合答案,符合返回1反之返回2.
{
    long long pp=an;
    for(long long i=1; i<=n; i++)
    {
        if(a[i]-an>0)
        {
            long long uzi=a[i];
            uzi-=an;
            if(uzi%k==0)
                pp-=uzi/k;
            else
                pp=pp-(uzi+k)/k;
        }
        if(pp<0)
            return 0;
    }
    return 1;
}
int main()
{
    while(~scanf("%d",&n))
    {
        l=1;
        long long maxn=0;
        for(long long i=1; i<=n; i++)
        {
            scanf("%lld",&a[i]);
            maxn=max(maxn,a[i]);
        }
        r=maxn;
        scanf("%d",&k);
        k--;
        if(k==0)//特判k==0时的情况,不然会re
        {
            printf("%lld\n",maxn);
            continue;
        }
        while(l<=r)//直接二分
        {
            pan=(l+r)/2;
            if(pding(pan))
            {
                r=pan-1;
            }
            else
            {
                l=pan+1;
            }
        }
        printf("%lld\n",l);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值