貪欲:コラルブック

そこN牛の放牧ストール。
同じ期間における各失速は、牛の放牧に提供することができ、それは、複数の囲いを必要とするかもしれません。
牛牛あたりNは、開始時間Aと時間Bの斜端を放牧与えられ、この期間の[A、B]内のそれぞれの牛が放牧されているであろう。
(含む)の間隔を放牧2頭の交差点がある場合には、牛の2つのヘッドが同じ囲い放牧に配置することができません。
各動物の失速に対応する最小数を求めて、プログラムのニーズを失速。
入力形式の
1行目:入力整数N. 

最初2..n + +1:ライン+ I 1の数字の間の空間によって分離されたi番目の放牧放牧牛と終了時刻Bの行入力開始時刻。

出力形式の
1行目:入力屋台の最低限必要な数を表す整数。

最初2..n +1:ライン+ I 1〜I-ライン入力囲い牛であれば、プログラムが正当であることができるように、1から始まる番号の中に入れました。

データ範囲
1 ≤N≤ 50000 1 ≤A、B≦ 1000000

 

サンプル入力:

5 
1 10 
2 4 
3 6 
5 8 
4 7

  

出力例:

4 
1 
2 
3 
2 
4

 

主な問題は、知識ポイント範囲のパケットを調べることです

関連の知識ポイントを参照してください。https://www.cnblogs.com/myhnb/p/11243677.html

ACコード

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
typedefのペア<int型、int型> PII。
CONST int型N = 5 * 1E4 + 10。
PRIORITY_QUEUE <PII、ベクトル<PII>、大きな<PII>> G。
対<ペア<整数、整数>、整数> P [N]。
INT D [N]。
int型nは、CNT; 

INTメイン()
{ 
    scanf関数( "%のD"、&N); 
    以下のために(INT i = 1; iが<= N; iは++)
    { 
        P [i]は.second = I。
        scanf関数( "%dの%のD"、&P [i]は.first.first、&P [i]の.first.second)。
    } 
    ソート(P + 1、P + N + 1)。
    CNT = 1。
    g.push(make_pair(P [1] .first.second、1))。
    D [P [1] .second] = 1。
    (私は++; iが<= N I = 2の整数)のための
    { 
        IF(P [i]が.first.first <= G。
            g.push(make_pair(P [i]の.first.second、++ CNT))。
            D [P [i]は.second] = CNT。
        } 
        { 
            = g.top(今INT)まず、Z = g.top()は、第2の。。。
            g.pop(); 
            今= MAX(今、P [i]の.first.second)。
            g.push(make_pair(ここで、Z))。
            D [P [i]は.second] = Z; 
        } 
    } 
    のprintf( "%d個の\ n"、g.size())。
    以下のために(INT i = 1; iが<= N; iは++)のprintf( "%Dを\ n"、Dを[I])。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/myhnb/p/11243700.html