题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1896
题目意思:一条路上放了很多石头,小明(虽然原题不是小明,但不要在意这些细节,都是人名嘛)在遇到第奇数块石头的时候,他可以将石头扔到前面去,如果同时又很多石头,那扔能仍得最近的那个,遇到第偶数块石头的时候就跳过。
题目分析:直接用优先队列维护离小明最近的石头呀。即用优先队列模拟这个过程。
下面是AC代码;
#include"stdio.h"
#include"queue"
#include"string.h"
using namespace std;
int d[100011];
struct node
{
int dis;
int d;
friend bool operator<(node n1,node n2)
{
if(n1.dis!=n2.dis) return n2.dis<n1.dis;
return n2.d<n1.d;
}
};
int MAX(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T;
node cur,next;
int num;
int i;
int n;
int ans;
scanf("%d",&T);
while(T--)
{
priority_queue<node>q;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&cur.dis,&cur.d);
q.push(cur);
}
num=0;
ans=0;
while(!q.empty())
{
num++;
cur=q.top();
q.pop();
ans=MAX(ans,cur.dis);
if(!(num%2)) continue;
next.dis=cur.dis+cur.d;
next.d=cur.d;
q.push(next);
}
printf("%d\n",ans);
}
return 0;
}