題目描述
shopee的零食櫃,有着各式各樣的零食,但是因爲貪吃,小蝦同學體重日益增加,終於被人叫爲小胖了,他終於下定決心減肥了,他決定每天晚上去操場跑兩圈,但是跑步太累人了,他想轉移注意力,忘記痛苦,正在聽着音樂的他,突然有個想法,他想跟着音樂的節奏來跑步,音樂有7種音符,對應的是1到7,那麼他對應的步長就可以是1-7分米,這樣的話他就可以轉移注意力了,但是他想保持自己跑步的速度,在規定時間m分鐘跑完。爲了避免被累死,他需要規劃他每分鐘需要跑過的音符,這些音符的步長總和要儘量小。下面是小蝦同學聽的歌曲的音符,以及規定的時間,你能告訴他每分鐘他應該跑多少步長?
題解代碼
作者:Cantwell
鏈接:https://www.nowcoder.com/questionTerminal/24a1bb82b3784f86babec24e4a5c93e0
來源:牛客網
import java.util.Scanner;
/**
* Shopee的零食櫃
* https://www.nowcoder.com/questionTerminal/24a1bb82b3784f86babec24e4a5c93e0
*/
public class ShopeeSnacksArk {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
// 最大的一步
int left = -1;
// 總步數
int right = 0;
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
left = Math.max(left, arr[i]);
right += arr[i];
}
while (left < right) {
int mid = (left + right) >> 1;
int cmp = check(arr, mid, m);
if (cmp == -1) {
// 花費時間小於m,應縮小step
right = mid - 1;
} else if (cmp == 1) {
// 花費時間大於m,應增大step
left = mid + 1;
} else {
// 進一步縮小step
right = mid;
}
}
System.out.println(left);
sc.close();
}
// 每分鐘走step步,若花費時間小於m分鐘,返回-1,若相等,返回零,若大於,返回1
private static int check(int[] arr, int step, int m) {
int sum = 0;
int num = 1;
for (int value : arr) {
if (sum + value <= step) {
sum += value;
} else {
sum = value;
num++;
}
}
return Integer.compare(num, m);
}
}