牛牛晾衣服
位数求和
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; }