思路:
从大往小开始买
每次买判断队列中是否满足要求
每第二次买增加一次免费次数放入队列
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
long res = 0; // 踩坑:设置为long类型,结果很大
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
scanner.close();
Arrays.sort(nums);// 小 -> 大 排序
int t = n - 1;
Queue<Integer> queue = new LinkedList<>();
boolean flag = false;// 判断是否是第二次购买
while (t >= 0) {
if (!queue.isEmpty() && nums[t] <= queue.peek()) {
queue.poll();// 出队列
} else {
if (flag) {
queue.add(nums[t] / 2); // 第二次购买则增加免费次数
flag = false;
} else {
flag = true;
}
res += nums[t];
}
t--;
}
System.out.println(res);
}
}