51nod 1596 搬货物

该博客介绍了如何运用最小堆(优先队列)解决51nod上的1596题——搬货物。通过将所有货物放入优先队列,依次取出两件比较,若相等则合并后重新加入队列;不等则小的放入数组,大的返回队列,直至队列为空。最终数组的大小即为答案,注意实际实现中需考虑最后一件货物的处理方式。
摘要由CSDN通过智能技术生成

先全都扔到优先队列里(最小堆),然后出队最小的两个,如果相等的话,合成一个新的再扔到队列里。如果不相等,则把出队那两个其中较小的扔一个单独的数组array里,另一个大一点的再扔回队列里,直到队列为空。array的尺寸就是结果。
我做的时候最后一个没再放回队列,所以是array.size()+1

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
    ios::sync_with_stdio(false);
    LL n;
    LL good;
    cin >> n;
    priority_queue<LL,vector<LL>,greater<LL>> que;
    vector<LL> remain;
    while(n--)
    {
        cin >> good;
        que.push(good);
    }
    LL a,b;
    while(!que.empty())
    {
        a = que.top();
        que.pop();
        if(que.empty())
        {
            que.push(a);
            break;
        }
        b = que.top();
        if(a == b)
        {
            que.pop();
            que.push(a+1);
        }
        else
            remain.push_back(a);
    }

    cout << remain.size()+1 << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值