题意
每件衣服都有一定单位水分,在不适用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台烘干机,每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?
输入
第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9
输出
输出烘干N件衣服所需要的最短时间
样例输入
3
2 3 9
5
3
2 3 6
5
样例输出
3
2
个人理解,如果ai<mid,不用理他,可以自己晾干,如果ai>mid
if((a[i] - mid ) % k == 0) {
time += (a[i] - mid ) / k;
}else {
time += (a[i] - mid ) / k ;
time ++;
}
这里k是以前减过1的,可以自己想象一下,因为此时我将每个ai都减1了,不管用不用,时间过一个单位,都不用去算自己晾干的时间;除此之外还要向上取整,这个就好理解,比如7/5,应该是2,所以要加一
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long [] a = new long [n];
for(int i = 0; i < n; i++) {
a[i] = Integer.parseInt(sc.next());
}
long k = sc.nextInt();
long min = 0;
long max = Integer.MAX_VALUE;
if(k == 1) {
Arrays.sort(a);
System.out.println(a[a.length - 1]);
return;
}
while(max - min > 1) {
long mid = (min + max) / 2;
if(f(mid, a, k - 1)) max = mid;
else min = mid;
}
if(f(min, a, k - 1)) System.out.println(min);
else System.out.println(max);
sc.close();
}
public static boolean f(long mid, long [] a, long k) {
long time = 0;
for(int i = 0; i < a.length; i++) {
if(time > mid) return false;
if(a[i]> mid) {
if((a[i] - mid ) % k == 0) {
time += (a[i] - mid ) / k;
}else {
time += (a[i] - mid ) / k ;
time ++;
}
}
}
return time <= mid;
}
}