題目連接:http://acm.hdu.edu.cn/showproblem.php?pid=1896php
題目大意:ios
n個石頭,每一個在位置p,一個屬性d。從最左邊開始往右走,遇到一個石頭,若是是第奇數次遇到,就把他往前仍d米,偶數次遇到就越過。問最後最遠的石頭距離起點多少米ide
思路:考慮用優先隊列,若是是第奇數個石頭,就修改其位置,入隊列,不然,出對列;spa
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 }