还是简单的优先队列!路过的大神请无视!!!
由于原来学长讲优先队列的时候没咋学,现在补啊!猛补啊!!!
############################################################################################
题意:
n个石头,每个在位置p,一个属性d。从最左边开始往右走,遇到一个石头,如果是第奇数次遇到,
就把他往前仍d米,偶数次遇到就越过。问最后最远的石头距离起点多少米;(读题很重要)
思路:
考虑用优先队列,如果是第奇数个石头,就修改其位置,入队列,否则,出对列;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#include<stdio.h>
#include<string.h>#include<queue>
using namespace std;
struct node
{
int pos,dis;
friend bool operator<(node a,node b)
{
if(a.pos!=b.pos)
return a.pos>b.pos;
return a.dis>b.dis;
}
};
int main()
{
priority_queue<node>Q;
int T,n;
node p,q;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
while(!Q.empty())
Q.pop();
while(n--)
{
scanf("%d%d",&p.pos,&p.dis);
Q.push(p);
}
int result=0,count=1;
while(!Q.empty())
{
if(count%2==1)
{
q=Q.top();
Q.pop();
q.pos+=q.dis;
result=q.pos;
Q.push(q);
}
else
Q.pop();
count++;
}
printf("%d\n",result);
}
return 0;
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1896
http://acm.hdu.edu.cn/showproblem.php?pid=1896