题意:
有n头奶牛,每头奶牛喝牛奶的时候都不愿意被打扰,告诉你每头奶牛开始喝牛奶和结束和牛奶的时间 a 和 b, 求至少需要多少个隔间,使每头奶牛喝牛奶的时间不相交
思路:
每头奶牛按照开始的时间从小到大排,每一次如果能安排进最早结束的隔间,则刷新此隔间的结束时间,否则开一个新的隔间
奶牛用结构体存储开始
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
const int maxn = 500005;
struct cow {
int start;
int end;
int num;
int id;
}cows[maxn];
bool operator < (const cow a, const cow b) {
return a.start<b.start;
}
bool cmp(cow a, cow b) {
return a.num < b.num;
}
int main() {
int N;
while (~scanf("%d", &N)){
for (int i = 0; i < N; i++) {
int a, b; scanf("%d%d", &a, &b);
cows[i].start = a;
cows[i].end = b;
cows[i].num = i+1;
}
sort(cows, cows + N);
int ans = 0;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > >q;
q.push(pair<int,int>(cows[0].end,++ans));
cows[0].id = ans;
for (int i = 1; i < N; i++) {
pair<int, int> p = q.top();//返回结束时间最早的
if (p.first < cows[i].start) {//如果可以安排的话,更新
q.pop();
cows[i].id = p.second;
q.push(pair<int, int>(cows[i].end, p.second));
}
else{//放入新的
q.push(pair<int, int>(cows[i].end, ++ans));
cows[i].id = ans;
}
}
cout << ans << endl;
sort(cows, cows + N, cmp);//按照原来输入的顺序输出
for (int i = 0; i < N; i++) {
cout << cows[i].id << endl;
}
}
}