hdu1896 Stones (优先队列)

 

 

Stones

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3700    Accepted Submission(s): 2417


 

Problem Description

Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning and walk back every evening. Walking may cause a little tired, so Sempr always play some games this time.
There are many stones on the road, when he meet a stone, he will throw it ahead as far as possible if it is the odd stone he meet, or leave it where it was if it is the even stone. Now give you some informations about the stones on the road, you are to tell me the distance from the start point to the farthest stone after Sempr walk by. 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.

 

 

Input

In the first line, there is an Integer T(1<=T<=10), which means the test cases in the input file. Then followed by T test cases.
For each test case, I will give you an Integer N(0<N<=100,000) in the first line, which means the number of stones on the road. Then followed by N lines and there are two integers Pi(0<=Pi<=100,000) and Di(0<=Di<=1,000) in the line, which means the position of the i-th stone and how far Sempr can throw it.

 

 

Output

Just output one line for one test case, as described in the Description.

 

 

Sample Input

 

2 2 1 5 2 4 2 1 5 6 6

 

 

Sample Output

 

11 12

 

 

Author

Sempr|CrazyBird|hust07p43

 

题意:一条路上面有许多的石头,我从路的起点开始走会遇见石头,遇见第奇数块石头,就把它往前扔,扔到它能扔到最大的距离;遇见第偶数块石头,就不管,若果同一个地点有两个及以上的石头,我先遇见的是能够扔的距离较近的石头,问我从起点到

最后一个石头扔到到位置的距离。

思路:遇见石头,把石头扔出去,可以联想到队列的入队与出队,针对同一个地点有两个及以上的石头,我先遇见的是能够扔的距离较近的石头,可以使用优先队列,扔的较近的石头的优先级就越高。

AC代码:

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> P; 
struct cmp    
{      
    bool operator ()(P &a,P &b)    
    {   
		if(a.first==b.first){
			return a.second>b.second;
		}
        return a.first>b.first;//最小值优先       
    }      
}; 
priority_queue<P,vector<P>,cmp > q;
int main(){
	int T;scanf("%d",&T);
	while(T--){
		int m;scanf("%d",&m);
		while(m--){
			int p,d;scanf("%d%d",&p,&d);
			q.push(P(p,d));
		}
		int stone=0;
		int ans=0;
		while(!q.empty()){
			stone++;
			P tmp=q.top();
			ans=max(ans,tmp.first);
			q.pop();
			if(stone%2){
				int p=tmp.first;
				int d=tmp.second;
				q.push(P(p+d,d));
			}
		}
		printf("%d\n",ans);
	}
	return 0;
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值