題目鏈接:傳送門
很明顯的貪心
就是讓一個柵欄儘可能多的放牛
按左端點排序,即每頭牛開始喫草的時間
維護最後一頭牛的喫草結束的時間
如果當前的牛可以跟他拼柵欄,那就拼,否則新開一個柵欄
詳細看代碼註釋
#include <bits/stdc++.h>
#define A 50010
#define pi pair<int, int>
#define fi first
#define se second
using namespace std;
int n, id[A]; pair<pi, int> c[A];
priority_queue<pi, vector<pi>, greater<pi> > q;
int main(int argc, char const *argv[]) {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d%d", &c[i].fi.fi, &c[i].fi.se), c[i].se = i;
sort(c + 1, c + n + 1);
for (int i = 1; i <= n; i++)
if (q.empty() or q.top().fi >= c[i].fi.fi) { //新開一個柵欄
pi fr = {c[i].fi.se, q.size()}; //把這個牛的信息放進去,{結束喫草的時間,所在柵欄(已開了幾個柵欄)}
id[c[i].se] = fr.se; q.push(fr); //更新這頭牛所在的柵欄
}
else {
auto fr = q.top(); q.pop(); //與別的妞拼柵欄
fr.fi = c[i].fi.se; //更新喫草結束的時間
id[c[i].se] = fr.se; //還是當前這個柵欄
q.push(fr);
}
cout << q.size() << endl;
for (int i = 1; i <= n; i++) printf("%d\n", id[i] + 1);
return 0;
}