STL优先队列 hdu1896

扔石头 hdu 1896

题意:扔石头,到奇数个石头往前仍,偶数个石头什么也不做,看最后能扔多远,输出最远的距离

优先队列,一次放入,定义优先级位置靠前距离小的石头优先级高,奇数个取出栈顶更新后放入,偶数个直接取出,队列为空结束。

利用优先队列,将位置大的放在最前面,小的放在最后边

测试数据

输入数据

2

2

1 5 

2 4

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;
}
原文地址:https://www.cnblogs.com/someonezero/p/12807140.html