链接: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;
}