hdu 1896 优先队列的应用

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1896

题目大意:

n个石头,每个在位置p,一个属性d。从最左边开始往右走,遇到一个石头,如果是第奇数次遇到,就把他往前仍d米,偶数次遇到就越过。问最后最远的石头距离起点多少米

思路:考虑用优先队列,如果是第奇数个石头,就修改其位置,入队列,否则,出对列;

View Code
 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 
 5 struct Point{
 6     int pos;
 7     int dis;
 8     bool operator < (const Point  p) const {
 9         if(p.pos!=pos)
10             return p.pos<pos;
11         return p.dis<dis;
12     }
13 };
14 
15 priority_queue<Point>Q;
16 
17 int main(){
18     int _case;
19     scanf("%d",&_case);
20     while(_case--){
21         int n;
22         scanf("%d",&n);
23         while(!Q.empty())Q.pop();
24         Point p,q;
25         while(n--){
26             scanf("%d%d",&p.pos,&p.dis);
27             Q.push(p);
28         }
29         int result=0,count=1;
30         while(!Q.empty()){
31             if(count&1){
32                 q=Q.top();
33                 Q.pop();
34                 q.pos+=q.dis;
35                 result=q.pos;
36                 Q.push(q);
37             }else 
38                 Q.pop();
39             count++;
40         }
41         printf("%d\n",result);
42     }
43     return 0;
44 }

 

posted @ 2013-03-06 09:39  ihge2k  阅读(350)  评论(0编辑  收藏  举报