HU 1896優先列2

3394 ワード

D- 優先列入門2
Time Limit:3000 MS     メモリLimit:32768 KB     64 bit IO Format:%I 64 d&%I 64 u
Submit 
Status 
Practice 
HDU 1896
Description
Because of the wrong status of the bicycle、Sempr begin to walk eat to west everry moning and walk back evereverening.Walking may cause a little tired、so Sempr alys Play some games this time. 
The e e e are many stones on the road,when he meet a stone,he will throw it ah ead as far as possible if it is the odd stone he meet,or leave it where it wars it is the even stone.Now You.You are to tell me the distance from the start point to the farthest st one after Sempr walk by.Please party atent that if t to to to to to to to to the stayt the same position,you will meet the large one 
 
Input
In the first line,there is an Integer T(1<=T<=10),which means the test cases in the input file.The n 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 the road.Thn followwed byN lins and there there there there the the the the the the the the the the the the the the ininininininininininininininininststststststststststststinininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininn 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
 
道にはたくさんの石があります.奇数の石があれば、彼を前にしても、偶数の石は動かないでください.もし二つの石が一緒なら、先に考えてもいいです.近い石はやはり大きい石です.このままずっと下に降ります.前の石が全部なくてもいいです.
この過程を座標化します.Piは座標です.Diはいくつかの単位の長さがあります.
ここで優先列を使うか、それともカスタム構造体を使うかの方法です.
struct point
{
	int dis,pos;
	friend bool operator <(point a,point b)
	{
		if(a.pos==b.pos)
			return a.dis>b.dis;
		return a.pos>b.pos;
	}
};
と同様に、タイトルには「
二つの石が一緒なら、まず近い石はやはり大きい石だと考えてください.だからif(a.pos==b.pos)があるはずです. return a.dis>b.dis;
return文の中の‘’と‘’の判断については、具体的にこのように使います.ここで簡単に記憶をまとめることができます.
最大優先列である場合は、符号を用います.
最小優先列の場合は、符号で比較します.
本題の距離と位置は小さい優先なので、二つのreturn文は全部<を使います.
全コードは以下の通りです
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

struct point
{
	int dis,pos;
	friend bool operator <(point a,point b)
	{
		if(a.pos==b.pos)
			return a.dis>b.dis;
		return a.pos>b.pos;
	}
}t;

int main()
{
	int i,n,m,p,d;
	scanf("%d",&m);
	priority_queue<point>q;
	while(m--)
	{
		scanf("%d",&n);
		while(!q.empty())
			q.pop();
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&t.pos,&t.dis);
			q.push(t);
		}
		int ans=0,count=1;
		//point p;
		while(!q.empty())
		{
			if(count&1)
			{
				t=q.top();
				q.pop();
				t.pos+=t.dis;
				ans=t.pos;
				q.push(t);
			}
			else
				q.pop();
			count++;
		}
		printf("%d
",q.top().pos); } return 0; }