HDU - 1896 Stone重载的优先队列

因为自行车的位置不对,塞姆普开始每天早上从东到西步行,每天晚上步行回来。散步会引起疲劳,所以这次塞姆普总是在路上玩一些游戏。
路上有很多石头,当他遇到一块石头时,如果碰到的是第奇数个的石头,他会尽可能地把它扔到前面;如果碰到的是第偶数个的石头,他会把它留在原处。现在给您一些关于路上石头的信息,您要告诉我从起点到塞姆普路过的最远石头的距离。请注意,如果两个或更多的石头停留在同一位置,您将首先遇到较大的(具有最小Di的,如输入中所述)。
Input
在第一行中,有一个整数T(1<=T<=10),它表示输入文件中的测试用例。
然后是T个测试用例。对于每个测试用例,我将在第一行中给出整数N (0<=N<=100000),这意味着路上的石头数量。然后是N行,行中有两个整数Pi(0<=Pi<=100000)和Di(0<=Di<=1000),这意味着第i个石头的位置以及塞姆普可以把它扔多远。
Output
个测试用例输出一行,如描述所述。
Sample Input
2
2
1 5
2 4
2
1 5
6 6
Sample Output
11
12
这个题需要用到重载"<",这是我的薄弱点,写下来记录一下。
在这个重载的优先队列里,将优先级设置为当坐标一样的时候,将di按从大到小排序,注意"<"表示的是从小到大,否则,坐标大 的石头优先度高。

#include<cstdio>
#include<queue>
using namespace std;
struct stone
{
	int pi;
	int di;
	friend bool operator<(const stone &a,const stone &b)
	{
		if (a.pi==b.pi)//这里的重载很重要,坐标相同时,以di小的优先
			return a.di>b.di;
		else 
		return a.pi>b.pi;
	}
};
int main(void)
{
	int T;
	while(scanf("%d",&T)!=EOF)
	{
		while(T--)
		{
			int N;
			scanf("%d",&N);
			priority_queue<stone> ss;
			stone k;
			while(N--)
			{
				scanf("%d",&k.pi);
				scanf("%d",&k.di);
				ss.push(k);
			}
			int flag=1;//判断当前遇到的是偶数石头还是奇数石头
			int fast;
			while(ss.empty()!=true)
			{
				if (flag%2!=0)
				{
					stone p=ss.top();
					ss.pop();
					p.pi+=p.di;
					ss.push(p);
					flag++;
				}
				else 
				{
					stone k=ss.top();
					ss.pop();
					if (ss.empty()==true)
					fast=k.pi;
					flag++;
			}
		}	
		printf("%d\n",fast);
	}
}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值