Shopee的零食櫃

題目描述

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章