HDU 1896 Stones

问题描述:

因为自行车的故障,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;
		}
	}
}


你可能感兴趣的:(HDU,优先级队列)