zoukankan      html  css  js  c++  java
  • 【题解】AcWing 111.畜栏预定

    题目传送门

    题目描述

    有N头牛在畜栏中吃草。
    
    每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。
    
    给定N头牛和每头牛开始吃草的时间A以及结束吃草的时间B,每头牛在[A,B]这一时间段内都会一直吃草。
    
    当两头牛的吃草区间存在交集时(包括端点),这两头牛不能被安排在同一个畜栏吃草。
    
    求需要的最小畜栏数目和每头牛对应的畜栏方案。
    

    输入格式

    第1行:输入一个整数N。
    
    第2..N+1行:第i+1行输入第i头牛的开始吃草时间A以及结束吃草时间B,数之间用空格隔开。
    

    输出格式

    第1行:输入一个整数,代表所需最小畜栏数。
    
    第2..N+1行:第i+1行输入第i头牛被安排到的畜栏编号,编号是从1开始的 连续 整数,只要方案合法即可。
    

    数据范围

    (1≤N≤50000,)(1≤A,B≤1000000)

    输入样例:

    5
    1 10
    2 4
    3 6
    5 8
    4 7
    

    输出样例:

    4
    1
    2
    3
    2
    4
    

    时间复杂度

    (O(nlogn))

    做法

    1. 将所有牛所占区间按左端点排序
    2. 将牛放入畜栏
      1.能放入,就放入
      2.不能放入,建新畜栏

    证明

    我不大会证明,严谨的证明看y总吧qwq

    实现

    用一个结构体存下牛的区间编号

    用一个小根堆来维护所有畜栏的最右端畜栏编号

    注意

    结构体需要存下牛的编号!!!

    如果没有存下编号,排序之后 i 便不是代表牛的编号了

    牛的编号就消失(打乱)了

    那时候本人一度搞不懂自己哪里错了

    AC 代码

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <vector>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 5e4 + 10;
    
    int n;
    int id[N];
    priority_queue <PII, vector<PII>, greater<PII> > heap;
    struct rec {
        int l, r, x;
        bool operator < (const rec &b) const
        {
            return l < b.l;
        }
    } seg[N];
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++)
        {
            scanf("%d%d", &seg[i].l, &seg[i].r);
            seg[i].x = i;
        }
        sort(seg, seg + n);
        int res = 0;
        for(int i = 0; i < n; i ++)
        {
            if(heap.empty() || seg[i].l <= heap.top().first)
            {
                id[seg[i].x] = ++ res;
                heap.push({seg[i].r, res});
            }
            else 
            {
                auto t = heap.top();
                id[seg[i].x] = t.second;
                heap.pop();
                heap.push({seg[i].r, t.second});
            }
        }
        printf("%d
    ", heap.size());
        for(int i = 0; i < n; i ++)
            printf("%d
    ", id[i]);
        return 0;
    }
    
  • 相关阅读:
    安装和使用Glassfish
    3GP 的 DASH设计原则与标准
    hdu 2686 Matrix 最小费用最大流 或 多线程DP
    [Win32]客户端程序
    二叉查找树中节点的删除。
    Android:获取屏幕完整宽高,包含状态栏
    Django学习总结之五模型
    畸形的从业观
    调试版本和发行版本
    jsp中常见的错误处理(未完待续)
  • 原文地址:https://www.cnblogs.com/RemnantDreammm/p/14423218.html
Copyright © 2011-2022 走看看