貪欲 - bailian 4144:囲い予約

タイトル

合計時間制限:1000msのメモリ制限:65536kBの
説明
ファームN牛、各牛になります[A、B]特定の時間間隔で搾乳ストールに(A及びBを含む)、及び同時に囲い唯一の牛の搾乳。今農家が起こったいくつかの屋台が上記の要件を満たし、かつプログラムは、それぞれの牛は、請求項の取り決めに与えられているかを知りたいです。一種類のメイン出力に多くの実現可能な解決策のために。

入力
入力の最初の行の整数N(1≤N≤50、含ま 000)、 タウN発現を、N行目以降は、それぞれ2つの数、牛の搾乳時間が含まれている[AI、バイ] (1≤A≤B≤1、 000、000)。
出力
出力の最初の行のは、ストールの最小の数を表す整数を含み、次の行Nは、i行目のI + 1(1から始まる)牛ストール割り当てられた番号として記載されています。
サンプル入力
。5
。1 10
2 4
。3. 6
。5 8
4 7
の出力例
。4
。1
2
3
2
。4
ソース
http://poj.org/problem?id=3190

分析

各搾乳牛の位置を配置するので、時間が一致牛の搾乳は、同じ囲い内に配置することができない、注文の時間に応じて、すべての牛の最後にすべての牛の囲いをI-チェック用牛を搾乳開始時間、囲い、jの第一の端部を選択し、私は最初の大きな時間を起動した場合、I-牛を比較し、開始時刻と終了時刻は、牛、私は囲いJへの牛の第1のヘッドになります、それ以外の場合は、家畜列の拡張、畜舎新しい内部への牛のi番目のヘッドの拡大に加え、囲いの数。

コード

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define MAX 50010

using namespace std;

struct Node {
    int s, e;
    int id;
    friend bool operator < (const Node & a, const Node & b)  {
        return a.e > b.e;
    }
}cows[MAX];

int use[MAX];

bool cmp (Node & a, Node & b){
    return a.s < b.s;
}

priority_queue<Node> q;

int main(){
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d%d", &cows[i].s, &cows[i].e);
        cows[i].id = i;
    }
    sort(cows, cows + n, cmp);
    int ans = 0;
    for(int i = 0; i < n; i++){
        q.push(cows[i]);
        if(!q.empty() && q.top().e < cows[i].s){
            use[cows[i].id] = use[q.top().id];
            q.pop();
        }
        else{
            ans ++;
            use[cows[i].id] = ans;
        }
    }
    printf("%d\n", ans);
    for(int i = 0; i < n; i++){
        printf("%d\n",use[i]);
    }
    return 0;
}

参考:https://www.cnblogs.com/aiqinger/p/12587625.html

おすすめ

転載: www.cnblogs.com/zhangyue123/p/12626459.html