畜栏预定(0x07 贪心)

简介: 笔记

畜栏预定


题意

有 N 头牛在畜栏中吃草。


每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。


给定 N 头牛和每头牛开始吃草的时间 A 以及结束吃草的时间 B,每头牛在 [A,B] 这一时间段内都会一直吃草。


当两头牛的吃草区间存在交集时(包括端点),这两头牛不能被安排在同一个畜栏吃草。


求需要的最小畜栏数目和每头牛对应的畜栏方案。


思路

将问题转换为,将一些区间分配到一些数轴上,同一数轴上的任意两个区间没有交集,问最少需要多少个数轴。


将区间按左端点升序排序,同时用一个优先队列(小根堆)存储每个数轴上区间右端点的最大值,那么堆顶就是右端点最小的数轴,如果最小的右端点都和待入的区间有交集,那么放在其他的数轴自然也会有交集。 如果当前区间能插入到某个数轴,那么更新此数轴的右端点为当前区间的右端点,否则只能开辟一个新的数组,并将其右端点设置为当前区间的右端点。


最后统计优先队列的大小即为最终答案。


代码

#include<bits/stdc++.h>
#include<unordered_map>
// #define int long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
const int N = 5e4 + 10;
int n;
struct Node {
  int l;
  int r;
  int idx;
  bool operator<(Node x) const {
    return l < x.l;
  }
}node[N];
int res[N];
priority_queue<PII, vector<PII>, greater<PII>>q; //小根堆
void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i)cin >> node[i].l, cin >> node[i].r, node[i].idx = i;
  sort(node + 1, node + 1 + n);
  for (int i = 1; i <= n; ++i) {
    if (!q.size())q.push({ node[i].r ,1 }), res[node[i].idx] = 1;
    else {
      if (q.top().first >= node[i].l) {
        q.push({ node[i].r ,q.size() + 1});
        res[node[i].idx] = q.size();
      }
      else {
        auto t = q.top();
        q.pop();
        t.first = node[i].r;
        res[node[i].idx] = t.second;
        q.push(t);
      }
    }
  }
  cout << q.size() << endl;
  for (int i = 1; i <= n; ++i)printf("%d\n", res[i]);
}
signed main() {
  // int t; cin >> t;
  // while (t--)
    solve();
  return 0;
}


目录
相关文章
|
3天前
|
算法 前端开发 调度
贪心算法适用于解决什么类型的问题?
贪心算法适用于解决什么类型的问题?
60 1
|
3天前
|
人工智能 BI
经典问题之区间分组
经典问题之区间分组
|
3天前
|
算法 测试技术 C++
【贪心 堆 】3081. 替换字符串中的问号使分数最小
【贪心 堆 】3081. 替换字符串中的问号使分数最小
|
3天前
|
算法 测试技术 C#
【树 图论 阶乘 组合 深度优先搜索】1916. 统计为蚁群构筑房间的不同顺序
【树 图论 阶乘 组合 深度优先搜索】1916. 统计为蚁群构筑房间的不同顺序
|
3天前
|
机器学习/深度学习 人工智能 算法
【动态规划】【组合数学】【C++算法】920播放列表的数量
【动态规划】【组合数学】【C++算法】920播放列表的数量
|
算法
Day24——组合(回溯算法)
Day24——组合(回溯算法)
86 0
Day24——组合(回溯算法)
|
算法
染色法判定二分图算法模板
染色法判定二分图
45 0
|
存储 算法
四式解决回溯算法:组合+组合总和
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
668 3
|
算法 Java C++
算法系统学习-取数先取如何必定获胜?(相对或近似贪心)
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
227 0
|
算法 Java
子字符串匹配常用算法总结
子字符串匹配 子字符串匹配算法的定义: 文本长度:N 模式字符串长度:M 有效位移:s
256 0