问题描述:
因为自行车的故障,semper开始每天早上从东走到西,在走回来,他经常玩一些游戏。在路边有一些石头,当他看到奇数的石头,他将尽可能扔远,如果是偶数的石头,就不管。现在给你一些石头的信息,你要告诉我从起点到最远处的石头的距离,请注意如果有两个或多个石头在同一个位置,他会选择大的扔,也就是能扔的距离较短的那一个。
Input:
第一行,有一个整数T(1<=T<=10),意味着测试案例的数目。然后跟随T个案例。
对于每一个测试案例,我会给你一个整数N,(0<N<=100000)在第一行,意味着路边石头的数量。然后跟随N行,每行有两个整数Pi(0<=Pi<=100000)和Di(0<=Di<=1000)。意味着第i个石头的位置,和sempr能扔多远。
Output:
每个案例输出一行。
Sample Input
2 2 1 5 2 4 2 1 5 6 6
Sample Output
11 12
import java.util.*;
//将每块石头按照坐标优先级放入优先级队列,每取出一块石头,再放入一块石头,只是它的位置属性改变了,但是能扔的距离保持不变
//注意到奇数扔,偶数不扔,弹出一个石头之后,添加新位置的石头,然后需要在弹出偶数的石头
public class StoneTest {
public static void main(String[] args){
PriorityQueue<Stone> pq=new PriorityQueue<Stone>();
Scanner cin=new Scanner(System.in);
int numCase=cin.nextInt();
for(int i=0;i<numCase;i++){
int numStone=cin.nextInt();
for(int j=0;j<numStone;j++){
int pi=cin.nextInt();
int di=cin.nextInt();
pq.offer(new Stone(pi,di));
}
Stone stone=null;
while(pq.size()!=0){
stone=pq.poll();
pq.offer(new Stone((stone.Pi+stone.Di),stone.Di));
stone=pq.poll();
}
System.out.println(stone.Pi);
}
}
}
class Stone implements Comparable<Stone>{
int Pi;
int Di;
Stone(int pi,int di){
this.Pi=pi;
this.Di=di;
}
public int compareTo(Stone sto){
if(Pi>sto.Pi)return 1;
if(Pi<sto.Pi)return -1;
else{
if(Di>sto.Di)return 1;
else return -1;
}
}
}