AcWing 111. 畜欄預定

題目鏈接:傳送門

很明顯的貪心
就是讓一個柵欄儘可能多的放牛
按左端點排序,即每頭牛開始喫草的時間
維護最後一頭牛的喫草結束的時間
如果當前的牛可以跟他拼柵欄,那就拼,否則新開一個柵欄
詳細看代碼註釋

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章