Problem - 1896 (hdu.edu.cn)https://acm.hdu.edu.cn/showproblem.php?pid=1896这一题使用到优先队列来模拟扔石头的场景,在自定义优先队列规则的时候,需要小心,题目中写道
①“如果第奇数次遇到石头,则往前仍,如果是第偶数次遇到石头,则不进行任何操作。”
②Please pay attention that if two or more stones stay at the same position, you will meet the larger one(the one with the smallest Di, as described in the Input) first.
我现在感觉这句话有点问题,又是larger one 又是smallest Di,编写的程序是按照括号里的,先选择较小的Di进行操作。
下面是我自己新造的测试用例以及加了一些输出语句的结果
1
3
1 5
6 6
6 10
----------------------以下是输出结果
Stone{place=1, distance=5}
Stone{place=6, distance=5}
Stone{place=6, distance=6}
Stone{place=6, distance=10}
Stone{place=12, distance=6}
Stone{place=18, distance=6}
18
Process finished with exit code 0
测试的时候可以把两个注释的区域打开,提交的时候需要注释掉或者删掉
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().solve();
}
Comparator<Stone> cStone = new Comparator<Stone>() {
@Override
public int compare(Stone o1, Stone o2) {
if (o1.place != o2.place) {
return o1.place - o2.place;
}
return o1.distance - o2.distance;
}
};
public void solve() {
PriorityQueue<Stone> queue = new PriorityQueue<>(cStone);
int T;
int stoneCnt, place, distance;
Scanner in = new Scanner(System.in);
T = in.nextInt();
while ((T--) != 0) {
stoneCnt = in.nextInt();
while ((stoneCnt--) != 0) {
place = in.nextInt();
distance = in.nextInt();
queue.add(new Stone(place, distance));
}
int cnt = 1;
Stone stone = null;
while (!queue.isEmpty()) {
stone = queue.poll();
// System.out.println(stone);
if (cnt % 2 == 1) {
distance = stone.distance;
place = stone.place + stone.distance;
queue.add(new Stone(place, distance));
}
cnt++;
}
System.out.println(stone.place);
}
}
}
class Stone {
int place;
int distance;
public Stone(int place, int distance) {
this.distance = distance;
this.place = place;
}
// @Override
// public String toString() {
// return "Stone{" +
// "place=" + place +
// ", distance=" + distance +
// '}';
// }
}