题目链接:传送门
很明显的贪心
就是让一个栅栏尽可能多的放牛
按左端点排序,即每头牛开始吃草的时间
维护最后一头牛的吃草结束的时间
如果当前的牛可以跟他拼栅栏,那就拼,否则新开一个栅栏
详细看代码注释
#include <bits/stdc++.h>
#define
#define
#define
#define
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;
}