牛牛晾衣服

位数求和

https://ac.nowcoder.com/acm/contest/6220/A

链接:https://ac.nowcoder.com/acm/contest/6220/C
来源:牛客网
牛牛有n件带水的衣服,干燥衣服有两种方式。
一、是用烘***,可以每分钟烤干衣服的k滴水。
二、是自然烘干,每分钟衣服会自然烘干1滴水。
烘***比较小,每次只能放进一件衣服。
注意,使用烘***的时候,其他衣服仍然可以保持自然烘干状态,现在牛牛想知道最少要多少时间可以把衣服全烘干。

示例1
输入
复制 3,[2,3,9],5
3,[2,3,9],5
输出
复制 3
3
说明
前两分钟对第三件衣服进行烘***烘干,使得衣服的水份分别为0,1,0,所以最快三分钟可以烘干。
备注:
第一个参数n(1 ≤ n ≤ 105),代表一共有多少件衣服。
第二个参数为n个数(1 ≤ an ≤ 109)组成的数组,代表n件衣服分别有多少水滴水。
第三个参数k(1 ≤ k ≤ 109),代表烘***每分钟能烘干k滴水。
程序应返回:一个整数,代表使n件衣服全部干燥所需要的最少的时间。

这个题可以通过二分晾衣服的时间的方法来解决,先把数组从小到大排序。所以晾衣服的的最大时间不会超过r=a[n-1],最小时间不会小于l=1.所以最短时间位于 1-a[n-1]之间。mid=(l+r)>>1;判断mid是否符合条件,若符合则答案位于 l-mid之间,不符合则位于mid+1 -r之间。直到l==r,得到的答案就是最短时间。ovo,第一次写题解,有问题的地方请大佬们纠正。

附上AC代码:

int solve(int n, vector<int>& a, int k) {
    // write code here
    int i,ans=0,r,l,mid,t;
    sort(a.begin(),a.begin()+n);
    l=1;r=a[n-1];
    while(l<r){
        mid=(l+r)>>1;t=mid;
        for(i=0;i<n;i++){
            if(a[i]-mid>0)
            {
                if((a[i]-mid)%(k-1)==0)
                t-=(a[i]-mid)/(k-1);
                else
                t=t-(a[i]-mid)/(k-1)-1;
            }
            if(t<0)
                break;
        }
        if(t>=0)
        {
            r=mid;
        }
        else
        {
            l=mid+1;
        }
    }
    return (l+r)/2;
}
全部评论
想知道为什么除以k-1,能解答一下么。。。直接除以k再加1不能通过例子;比如例子中3,[2,3,9]5,最开始假设mid为4了,2,3都能洗掉了,t = 9-4/k-1 = 2,这里为什么用k-1
点赞 回复 分享
发布于 2020-07-17 01:08
想了很久,感觉是这样:对于一件大于mid的衣服需要洗,可以洗到一半,就拿出来,让剩下的水自然晾干,假设洗的时间是x, 则有,x*k+(mid-x) >= a[i], 所以是,x=(a[i]-mid)/(k-1).
点赞 回复 分享
发布于 2020-07-23 20:00

相关推荐

双非一本失业第二年:《机器视觉垃圾分类》
点赞 评论 收藏
分享
评论
11
收藏
分享
牛客网
牛客企业服务