POJ 3190ストール予約プライオリティキュー

これらの好き嫌いN(1 <= N <= 50,000)牛ああ!彼らはとてもうるさいそれぞれが唯一明らかに両方の時間AとBを含むA ... B(1 <= A <= B <= 1,000,000)、間隔いくつかの正確な時間をかけて搾乳されること、FJを決定するために予約システムを作成する必要がありますされていますこれストール各牛が彼女の搾乳時間を割り当てることができます。もちろん、何の牛は他の牛と、このようなプライベートな瞬間を共有しません。

ヘルプFJ決定することによって:
納屋に必要な屋台の最小数をそれぞれ牛は彼女のプライベート搾乳期間持つことができるように
時間をかけてこれらの屋台の牛のアン割り当てを
多くの答えが各テストデータセットのために正しいです。プログラムの意志グレードあなたの答え。
入力
ライン1:単一の整数、N

ライン2 ... N + 1:i線は+ 1は2スペースで区切られた整数で牛私の搾乳間隔を説明します。
出力
ライン1:納屋が持たなければならない屋台の最小数。

ライン2 ... N + 1:回線I + 1は私が彼女の搾乳期間のために割り当てされる牛にストールを説明しています。
SampleInput
5
1 10
2 4
3 6
5 8
4 7
SampleOutput
4
1
2
3
2
4

質問の意味:期間nは乳牛(s、t)が与えられた2頭の牛がブルペンを共有することはできませんが、少なくとも、手配することができますどのように多くのブルペン尋ねる
アイデアを:最初の時間を大貪欲に小さな開始し、プライオリティキューのメンテナンス後プライオリティキューがある一定の期間の終わり場合、時間帯、各牛の終了以前の時間が少なく、配列の開始時間よりも、2頭の牛が共通の牛舎、または別のブルペンを開く必要に属しています。

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;
const int N = 50005;

int ans[N];

struct node
{
    int s,t;
    int id;///记录位置

    friend bool operator < (const node &a,const node &b)
    {
        if(a.t==b.t)
            return a.s < b.s;///优先队列中以结束时间升序排列,最小留在堆顶
        return a.t > b.t;
    }

} a[N];

bool cmp(node a,node b)///数组中以开始时间升序排序
{
    if(a.s!=b.s)
        return a.s < b.s;
    return a.t < b.t;
}

int main()
{
    int n;
    ios::sync_with_stdio(false);

    while(cin >> n)
    {
        for(int i=1; i<=n; i++)
        {
            cin >> a[i].s >> a[i].t;
            a[i].id=i;
        }

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

        int res=1;

        priority_queue<node>que;

        que.push(a[1]);///先压入第一个数
        ans[a[1].id]=1;

        for(int i=2; i<=n; i++)
        {
            if(!que.empty()&&que.top().t<a[i].s)///如果堆顶的结束时间小于当前这头牛的开始时间则在不同时间可以共用一个牛棚
            {
                ans[a[i].id]=ans[que.top().id];///记录答案
                que.pop();
            }
            else
            {
                res++;///不满足的话就需要另一个牛棚 答案加一
                ans[a[i].id]=res;
            }
            que.push(a[i]);
        }

        cout << res << endl;

        for(int i=1; i<=n; i++)
            cout << ans[i] << endl;
    }

    return 0;
}

概要:実際には、長い配列の添字の初めの使用などとして、あなたは下付きレコードとして答えを行くことができ、答えを録音する方法、使用する方法を知っている必要がありますその時、私はそれがプライオリティキューではありません書いていません

公開された54元の記事 ウォンの賞賛0 ビュー1233

おすすめ

転載: blog.csdn.net/weixin_44144278/article/details/98904054