还是优先队列问题,题目大意:路上有很多石头,当你遇到奇数序列的石头就把他向前仍,偶数的不动他,如果两个石头一起,先考虑可以仍的比较近的石头仍也就是比较大的石头,这样一直下去,直到前面所有的石头都不可以仍了为止。
其实就是将这个过程坐标化,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;
}