题意:奶牛挤奶问题,每只奶牛在[a,b]的时间内挤奶,要求挤奶的过程中不能不打扰,且只能自己一个人独享挤奶的机器。问最少需要多少个挤奶的机器?
思路:
- 对奶牛挤奶开始的时间从小到大开始排序。
- 将正在工作的奶牛放在"队列"中,这里采用的是"优先队列"
- 如果后面的一个奶牛的开始时间大于在队列中工作的结束时间,则不需要加机器,只需要将正在工作的奶牛pop出去,然后放入新的奶牛 否则要加机器
代码中对思路3的实现
pq.push(cow[0]); for (int i = 1; i < n; i++) { Cow t = pq.top(); if (cow[i].b > t.e) { pq.pop(); num[cow[i].id] = num[t.id]; } else { num[cow[i].id] = ans++; } pq.push(cow[i]); }
注意点:
- 本题需要奶牛的序号即id 所以需要保存每只奶牛的id才方便后面的使用,不然排序一下,id全部改变了.
- 排序的时候如果相同的开始时间,就按照结束时间由小到大排序
#include <iostream> #include <algorithm> #include <queue> #include <cstdio> using namespace std; struct Cow { int id, b, e; bool friend operator<(Cow a, Cow b) { return a.e > b.e; } }cow[50001]; int cmp(Cow a, Cow b) { if (a.b == b.b) { a.e < b.e; } return a.b < b.b; } int main() { int n; int ans = 0, num[50001]; scanf("%d", &n); for (int i = 0; i < n; i++) { cow[i].id = i; scanf("%d%d", &cow[i].b, &cow[i].e); } sort(cow, cow + n, cmp); priority_queue<Cow> pq; num[cow[0].id] = ans++; pq.push(cow[0]); for (int i = 1; i < n; i++) { Cow t = pq.top(); if (cow[i].b > t.e) { pq.pop(); num[cow[i].id] = num[t.id]; } else { num[cow[i].id] = ans++; } pq.push(cow[i]); } printf("%d ", ans); for (int i = 0; i < n; i++) printf("%d ", num[i] + 1); return 0; }