HDU6438 Buy and Resell

HDU6438 Buy and Resell

比较经典的贪心问题了

爬山 or 堆 ?

#include <bits/stdc++.h>

using namespace std;
const int maxn = 100005;
typedef long long ll;
struct goods
{
    int f,cost;
    goods(){};
    goods(int _f,int _cost)
    {
        f = _f;cost = _cost;
    }
    bool operator < (const goods & _goods)const
    {
        if(cost == _goods.cost){
            return f < _goods.f;
        }
        return cost < _goods.cost;
    }
}a[maxn];
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i].cost);
        }
        priority_queue<goods>q;
        while(!q.empty())q.pop();
        ll ans = 0,sum = 0;
        q.push(goods(0,a[n].cost));
        for(int i=n-1;i>=1;i--)
        {
            if(a[i].cost < q.top().cost){
                if(q.top().f == 0)
                {
                    sum += 2;
                    ans += (q.top().cost-a[i].cost);
                    q.pop();
                    q.push(goods(1,a[i].cost));
                }
                else{
                    ans += (q.top().cost-a[i].cost);
                    int ta = q.top().cost;
                    q.pop();
                    q.push(goods(1,a[i].cost));
                    q.push(goods(0,ta));
                }
            }
            else
            {
                q.push(goods(0,a[i].cost));
            }
           //cout<<"i: "<<ans<<" "<<sum<<endl;
        }
        cout<<ans<<" "<<sum<<endl;
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/solvit/p/9536813.html