FJUT 3876は、プライオリティキューバック貪欲へ行きます

moxin、最近とても貧しいだけで、彼女は販売するように貧しい人々、そしてmoxinは、いくつかの料理を買って、各皿ので、有効期限の時刻tiと対応する価格のwi、それは野菜を売っていないため、moxin、貧しい兄弟moxin豊かな女性を持っています不謹慎な人がいるので、料理のmoxinの種類、moxinに一日を購入することを決定した販売食品にどれだけの価値moxinを聞いて、その後、時間が無限であると仮定すると、期限切れの食品を販売していないのだろうか?(最初からの時間)

入力
入力N、代表野菜N(1 <= N <= 105 ) 、入力データの複数のセット

次のn行、各ラインは2つの数のWiを有し、TI(1 <= WI、TI <= 105)

出力
出力合計値

SampleInput
1
1 1
SampleOutput
1

問題の意味:までどのくらいの利益を依頼する、時間の無限の長さの販売を想定し、そこにN野菜、野菜、すべての締め切りがあり、自分の体重を持っています。
思考:これ、質問I WA 6ラウンドでプライオリティキューを使用すると、全体的なアイデアで、より良い前にあなたがいるよりも、理由は皿の裏に、優先順位の理由列にとの回答であります維持考慮されていませんでしたが+ +貪欲を並べ替えることですプライオリティキューのメンテナンス。
私は、コードのコメントに低い特定の外観を強制するために以下のコードを提供します

#include <queue>
#include <algorithm>
#include <cstdio>

using namespace std;
typedef long long LL;
const int N = 2e5+5;

struct node
{
    int t,v;
}a[N];///结构体存每种菜的期限和价值

bool cmp(node a,node b)///先以时间排 再以权值排
{
    if(a.t!=b.t)
        return a.t < b.t;
    return a.v > b.v;
}

int main()
{
    int n;

    while(~scanf("%d",&n))
    {
        priority_queue<int,vector<int>,greater<int> >que;///小根堆使得更小的排在前

        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i].v,&a[i].t);


        sort(a+1,a+1+n,cmp);

        LL res=0;

        for(int i=1;i<=n;i++)
        {
            if(que.size() < a[i].t)///满足时间条件的输入
            {
                res+=a[i].v;
                que.push(a[i].v);
            }
            else
            {
                if(a[i].v > que.top())///同一时间如果我的权值比你的大,则交换
                {
                    res-=que.top();
                    que.pop();
                    res+=a[i].v;
                    que.push(a[i].v);
                }
            }
        }

        printf("%lld\n",res);
    }
    
    return 0;
}
公開された54元の記事 ウォンの賞賛0 ビュー1238

おすすめ

転載: blog.csdn.net/weixin_44144278/article/details/98504816
おすすめ