HDU1896 优先队列2

D - 优先队列入门2

Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

Submit Status Practice HDU
1896

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 

还是优先队列问题,题目大意:路上有很多石头,当你遇到奇数序列的石头就把他向前仍,偶数的不动他,如果两个石头一起,先考虑可以仍的比较近的石头仍也就是比较大的石头,这样一直下去,直到前面所有的石头都不可以仍了为止。

其实就是将这个过程坐标化,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\n",q.top().pos);
	}
	return 0;
}

HDU1896 优先队列2

时间: 2024-12-26 23:05:51

HDU1896 优先队列2的相关文章

贪心+优先队列之更改优先级-hdu1896

题目描述: 题目理解: Sempr从位置0往前走,一路上他会遇到石子,如果这颗石子是他遇到的第奇数颗石子,那么他就把石子往前扔出去,如果他遇到的是第偶数颗石子,他会把它留在原地.需要注意的是,Sempr前面扔出去的石子,会继续作为后续会遇到的石子.如果在一个位置上有多颗石子,那么选出扔的最远的那颗石子扔出去. 比如说第一个测试案例:Sempr在位置1遇到了第一颗石子,他将石子扔到了1+5=6的位置上.Sempr继续往前走,在位置2上遇到第二颗石子,他将其留在原地,并且继续往前走.当Sempr走到

51nod1428(优先队列)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 题意:中文题诶- 思路:贪心 问最少要多少教室就是求最多有多少个时间段产生了交集咯.我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列. 接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值.对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加

优先队列实现哈弗曼最小权值

建立哈弗曼树要求我们每次都选频率权值最小的点构成节点,即权值小的点在树的深处,权值大的点在树的浅处,根据节点选择的特点,我们可以把节点的值放在优先队列中,包括新形成的节点. 我们先定义优先队列的优先级别. 1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队 然后就是实现的整个程序. #include<stdio.h> #inclu

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

hdu 4006 The kth great number(优先队列)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6982    Accepted Submission(s): 2837 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列(堆)

一.优先队列的一些简单的实现: 1. 使用一个简单的链表在表头以O(1) 执行插入操作,并遍历该链表以删除最小元,这需要O(N) 的时间. 2. 始终让表保持有序状态:这使得插入代价高昂(O(N)), 而删除代价低廉(O(1)).基于删除最小元的操作从不多于插入操作的事实,因此,前者是更好地想法. 3. 使用二叉查找树,它对这两种操作的平均运行时间是O(logN).尽管插入是随机的,而删除不是,但这个结论还是成立的.由于删除的唯一元素是最小元.反复除去左子树中的节点似乎损害树的平衡,使得右子树加

优先队列比较符重载

#include <iostream> #include <queue> using namespace std; struct Node{ int x, y; friend bool operator<(Node a, Node b){ return a.x > b.x; //x最小的节点在队首 } }; int main(){ priority_queue<Node> PQ; Node temp = {2, 3}; PQ.push(temp); temp

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

1475 建设国家(优先队列)

1475 建设国家 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 小C现在想建设一个国家.这个国家中有一个首都,然后有若干个中间站,还有若干个城市. 现在小C想把国家建造成这样的形状:选若干(可以是0个)的中间站把他们连成一条直线,然后把首都(首都也是一个中间站)连在这一条直线的左端.然后每个点可以连一个城市,特别的是最右端的点可以连接两个城市. 现在有n个城市的规划供小C选择.但是,他们那儿的交通条件比较差,他们那儿一天是2*H个小时,每个城市里面的人每天