扔石头 hdu 1896
题意:扔石头,到奇数个石头往前仍,偶数个石头什么也不做,看最后能扔多远,输出最远的距离
优先队列,一次放入,定义优先级位置靠前距离小的石头优先级高,奇数个取出栈顶更新后放入,偶数个直接取出,队列为空结束。
利用优先队列,将位置大的放在最前面,小的放在最后边
测试数据
输入数据
2
2
1 5
2 4
2
1 5
6 6
输出
11
12
分析输出结果 11是优先队列排好,取最后边的数,就是第一次取1 5 然后扔完位置 6 5 ,第二次取的时候,因为是偶数,所以把 2 4(因为2 4 的优先级大于6 5 ,因为重载了运算符)给扔了,什么操作也没有,第三次的时候 6 5 所以结果6+5 =11 再次进队,第四次的时候只有一个元素了,因为4是偶数,所以什么也不做,最后结果就是 11
输出12 11是优先队列排好,取最后边的数,就是第一次取1 5 然后扔完位置 6 5 ,第二次取的时候,因为是偶数,所以把6 5(因为6 5 的优先级大于6 6 )给扔了,什么操作也没有,第三次的时候 6 6 所以结果6+6 =12 再次进队,第四次的时候只有一个元素了,因为4是偶数,所以什么也不做,最后结果就是 12
代码参照 https://www.cnblogs.com/yzm10/p/7222616.html
//优先队列 //date:2020.4.30 #include <bits/stdc++.h> using namespace std; struct Node { int now,jump; friend operator <(Node a,Node b) { if(a.now==b.now) return a.jump>b.jump; return a.now>b.now; } } node,point; int main() { int t,n,res=0,c=0; priority_queue<Node>q; cin>>t; while(t--) { cin>>n; for(int i=0; i<n; i++) { scanf("%d%d",&node.now,&node.jump); q.push(node); } c=0; res=0; while(q.size()) { c++; point.now=q.top().now; point.jump=q.top().jump; q.pop(); if(c%2!=0) { point.now=point.now+point.jump; if(point.now>res) res=point.now; q.push(point); } } cout<<res<<endl; } return 0; }