• 【题解】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;
    }
    
  • 相关阅读:
    基于maven的javaweb项目模块化开发
    ramoops具体失败原因来解释驱动寄存器
    REQIMPORT-购买内部应用程序(R12.2.3)
    iOS_动态插入或删除行
    leetcode:pascal&#39;s_triangle_II
    设计模式-----观察者模式(Obsever)
    org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Propertie
    Unity3D-RPG项目实战(1):发动机的特殊文件夹
    NYOJ 372 巧克力的
    LeetCode Solutions : Reorder List
  • 原文地址:https://www.cnblogs.com/RemnantDreammm/p/14423218.html
Copyright © 2020-2023  润新知