洛谷1090 优先队列 priority_queue

153 阅读1分钟

洛谷P1090 传送门


这两天没刷题(忙着上王者),晚上洗完澡准备去切洛谷,然后刚刷一题就被卡住了。先上题(上面有原题链接):

合并果子

第一次,我很**的sort之后直接加,然后只过了样例。。。

第二次,我(明知会TLE)每次sort然后加上最小的两个数,然后TLE 50%

然后看了一下题解,第一篇是 堆?,然后又看了第二篇,发现是很简单的优先队列。(原来洛谷每道题都有标签。。)

ps:优先队列之前看过好几次,不过还没具体用过,总之应该就是压入元素的时候会自动排序

然后自己很快也写好了

int main()
{
    priority_queue<ll> p;
    int n;
    cin >> n;
    ll ans = 0;
    while (n--)
    {
        ll a;
        cin >> a;
        p.push(a);
    }
    while (p.size() >= 2)
    {
        ll temp = 0;
        ll a;
        a = p.top();
        ans += a;
        temp += a;
        p.pop();
        a = p.top();
        ans += a;
        temp += a;
        p.pop();
        p.push(temp);
    }
    cout << ans << endl;
    return 0;
}

不过写完之后才发现优先队列默认是降序排序的,而这题需要升序排序。。。。然后又去看了一下题解,好像是需要重载运算符由于今天太晚了所以就只好(被迫)Ctrl+C+V了。

在这里插入图片描述

int main()
{
    priority_queue<ll, vector<ll>, greater<ll> > p;
    //Ctrl CV(逃~
    
    // priority_queue<ll> p;    //我第一次写的
    int n;
    cin >> n;
    ll ans = 0;
    while (n--)
    {
        ll a;
        cin >> a;
        p.push(a);
    }
    while (p.size() >= 2)
    {
        ll temp = 0;
        ll a;
        a = p.top();
        ans += a;
        temp += a;
        p.pop();
        a = p.top();
        ans += a;
        temp += a;
        p.pop();
        p.push(temp);
    }
    cout << ans << endl;
    return 0;
}

另外,今天上王者了,明天应该能刷点洛谷(小声