養雞場還有多少隻雞? - Java - PriorityQueue,大頂堆

小強有 n 個養雞場,第 i 個養雞場初始有 a[i] 只小雞。與其他養雞場不同的是,他的養雞場每天增加 k 只小雞,小強每天結束都會在數量最多的養雞場裏賣掉一半的小雞,假如一個養雞場有 x 只雞,則賣出後只剩下 x/2 (向下取整)只雞。問 m 天后小強的 n 個養雞場一共多少隻小雞?
輸入 第一行輸入三個int 類型 n,m,k(1 <= n,m,k <= 10^6) 第二行輸入 n 個正整數,表示 n 個養雞場初始雞的個數
輸出 輸出一個整數表示雞的總數

示例 輸入:

3 3 100
100 200 400

輸出:

925

Java代碼

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

public class Solution {
    public static int chickenFarm(int n, int m, int k, int[] a) {
        // PriorityQueue默認是小頂堆,此處將參數改爲大頂堆
        Queue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
        // 保存養雞場原始的雞的數量
        int sum = 0;
        for (int i = 0; i < n; ++i) {
            queue.offer(a[i]);
            sum += a[i];
        }
        // 每個養雞場增加的雞數
        int incremental = 0;
        for (int i = 0; i < m; ++i) {
            incremental += k;
            // 雞最多的養雞場的雞數
            int max = queue.poll();
            // 這個養雞場當天賣掉的雞數,+優先級高於>>
            int reduced = max + incremental + 1 >> 1;
            // 剩餘的雞數放回堆裏
            queue.offer(max - reduced);
            // 原始的雞數減少
            sum -= reduced;
        }
        // 此時 incremental = k × m,sum表示原始的剩餘的雞數
        return incremental * n + sum;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章