小強有 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;
}
}