面向对象编程:堆
java提供了优先级队列PriorityQueue,底层是堆实现的,建立每一个塔对象,用两个优先级队列包含所有塔,一个大根堆,一个小根堆。
然后就简单了,从大小根堆取出对象,执行对象的add,remove方法,然后把操作日志记录到arraylist中去。
该思路帮助回忆了一手堆和优先级队列用法,面向对象思想QAQ.ps:lambda表达式真优美。
import java.util.*;
class Tow {
int id;
int num;
public Tow(int id, int num){
this.id = id;
this.num = num;
}
public void add(){
num++;
}
public void remove(){
num--;
}
}
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
Queue<Tow> minQ = new PriorityQueue<>(new Comparator<Tow>() {
@Override public int compare(Tow o1, Tow o2){
return Integer.compare(o1.num, o2.num);
}
});
PriorityQueue<Tow> maxQ = new PriorityQueue<>(new Comparator<Tow>() {
@Override public int compare(Tow o1, Tow o2){
return Integer.compare(o2.num, o1.num);
}
});
for(int i = 0; i < n; i++){
Tow temp = new Tow(i + 1, sc.nextInt());
// System.out.println(temp.num);
minQ.add(temp);
maxQ.add(temp);
}
int m = 0;
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList<Integer> arr2 = new ArrayList<>();
for(int i = 1; i <= k; i++){
if(minQ.peek().num < maxQ.peek().num){
Tow max = maxQ.poll();
Tow min = minQ.poll();
max.remove();
min.add();
arr1.add(max.id);
arr2.add(min.id);
maxQ.add(max);
minQ.add(min);
m++;
}else{
break;
}
}
System.out.println(maxQ.peek().num - minQ.peek().num + " " + m);
for(int i = 0; i < arr1.size(); i++){
System.out.println(arr1.get(i) + " " + arr2.get(i));
}
}
} 
京公网安备 11010502036488号