hdu1896(模拟+优先级队列)
2013-07-29 00:14
309 查看
Stones
[b]Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 659 Accepted Submission(s): 389
[/b]
[align=left]Problem Description[/align]
Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning and walk back every evening. Walking may cause a little tired, so Sempr always play some games this time.
There are many stones on the road, when he meet a stone, he will throw it ahead as far as possible if it is the odd stone he meet, or leave it where it was if it is the even stone. Now give you some informations about the stones on the road, you are to tell
me the distance from the start point to the farthest stone after Sempr walk by. Please pay attention that if two or more stones stay at the same position, you will meet the larger one(the one with the smallest Di, as described in the Input) first.
[align=left]Input[/align]
In the first line, there is an Integer T(1<=T<=10), which means the test cases in the input file. Then followed by T test cases.
For each test case, I will give you an Integer N(0<N<=100,000) in the first line, which means the number of stones on the road. Then followed by N lines and there are two integers Pi(0<=Pi<=100,000) and Di(0<=Di<=1,000) in the line, which means the position
of the i-th stone and how far Sempr can throw it.
[align=left]Output[/align]
Just output one line for one test case, as described in the Description.
[align=left]Sample Input[/align]
2
2
1 5
2 4
2
1 5
6 6
[align=left]Sample Output[/align]
11
12 本题是个模拟题,但若果直接模拟超内存或超时,可以选择用优先级队列,先按位置从小到大排序,若位置相同则按距离从小到大排序,每次去队头元素,若为取出的第奇数个,则出队列后修改位置后新的元素入队列;若取出的为第偶数个,则直接出队列。
#include<iostream> #include<queue> #include<algorithm> using namespace std; struct stone { int pos,dis; }sto[100000+10]; struct cmp { bool operator()(stone a,stone b) { if(a.pos!=b.pos) return a.pos>b.pos; else return a.dis>b.dis; } }; int main() { int cas,i,n,tot,k; cin>>cas; while(cas--) { scanf("%d",&n); priority_queue<stone,vector<stone>,cmp>qq; for(i=0;i<n;i++) { scanf("%d%d",&sto[i].pos,&sto[i].dis); qq.push(sto[i]); } k=1; stone tmp; while(!qq.empty()) { tmp=qq.top(); // if(1==k) // tot+=tmp.pos; qq.pop(); if(k%2) { //cout<<tmp.pos<<"&&&&"<<tmp.dis<<endl; //tot+=tmp.dis; // cout<<tot<<"****"<<endl; tmp.pos+=tmp.dis; qq.push(tmp); k++; } else k++; } // tot+=tmp.dis; printf("%d\n",tmp.pos); } return 0; }
相关文章推荐
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
- Java数组模拟优先级队列数据结构的实例
- C++模拟实现堆heap和优先级队列poriorty_queue
- 1443. Printer Queue(用一个数组模拟队列,优先级高的先出队列)
- HDU1509(优先级队列+模拟)
- 用数组模拟 优先级队列
- HDU1896 Stones【模拟+优先队列】
- 【C++】优先级队列的模拟实现
- HOJ 2778 CPU scheduling(STL 优先级队列+模拟)
- Java 模拟队列(一般队列、双端队列、优先级队列)
- 模拟进程队列管理——按照优先级入列
- PAT甲题题解-1014. Waiting in Line (30)-模拟,优先级队列
- leetcode 218. The Skyline Problem 优先级队列PriorityQueue + mulitset模拟Heap
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
- 利用优先级队列实现事件驱动模拟
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
- Java 模拟队列(一般队列、双端队列、优先级队列)
- (九)链式队列以及优先级队列应用
- 数据结构与算法(Java描述)-10、链式队列以及优先级队列的应用
- 优先级队列简介