タイトル
合計時間制限: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;
}