题目
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n= scan.nextInt();
PriorityQueue<Integer>[]g=new PriorityQueue[10];
Arrays.setAll(g,e->new PriorityQueue<>());
for (int i = 0; i < n; i++) {
int num= scan.nextInt();
int val= scan.nextInt();
g[num].add(val);
}
n/=10;
long ans=0;
for (int i = 0; i < 10; i++) {
while (g[i].size()>n){
ans=ans+g[i].poll();
}
}
System.out.println(ans);
scan.close();
}
}
解释
-
初始化优先队列数组:创建一个
PriorityQueue
数组g
,其中包含10个PriorityQueue<Integer>
对象,每个用于存储一组特定分类的整数值。数组的索引[0-9]
代表不同的分类。 -
填充优先队列:通过一个循环读取每一对数字。对于每对数字,第一个数字
num
表示分类(假设这里是0到9之间的数字),第二个数字val
是该分类下的具体值。根据num
的值,val
被添加到对应的g[num]
优先队列中。 -
计算要被移除的元素数量:由于目标是保持每个分类中的元素数量不超过总数的十分之一(
n/10
),计算这个值并存储在n
中,以确定每个分类队列中应该保留的元素数量。 -
计算总和:对于每个优先队列(每个分类),只要队列的大小大于
n
(即超过了应该保留的元素数量),就从队列中移除元素并将其值加到总和ans
中。这里使用的是poll()
方法,它从优先队列中移除并返回队首元素(最小的元素,因为PriorityQueue
默认是自然排序的,即数字较小的优先级高)。 -
输出总和:打印计算得到的总和
ans
。