• 贪心


    题目

    总时间限制: 1000ms 内存限制: 65536kB
    描述
    农场有N头牛,每头牛会在一个特定的时间区间[A, B](包括A和B)在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求,并要求给出每头牛被安排的方案。对于多种可行方案,主要输出一种即可。

    输入
    输入的第一行包含一个整数N(1 ≤ N ≤ 50, 000),表示有N牛头;接下来N行每行包含两个数,分别表示这头牛的挤奶时间[Ai, Bi](1 ≤ A≤ B ≤ 1, 000, 000)。
    输出
    输出的第一行包含一个整数,表示最少需要的畜栏数;接下来N行,第i+1行描述了第i头牛所被分配的畜栏编号(从1开始)。
    样例输入
    5
    1 10
    2 4
    3 6
    5 8
    4 7
    样例输出
    4
    1
    2
    3
    2
    4
    来源
    http://poj.org/problem?id=3190

    分析

    因为每一头牛都要安排位置挤奶,时间不重合的牛可以安排在同一畜栏挤奶,对所有牛根据开始挤奶的时间排序,对于第i头牛,检查畜栏中所有牛的结束时间,选取最先结束的畜栏j,将结束时间与第i头牛的开始时间比较,如果第i头牛开始时间大,就可以将第i头牛放入畜栏j,否则,将畜栏扩充,第i头牛放入扩充的新畜栏里边,畜栏个数加一。

    代码

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    #define MAX 50010
    
    using namespace std;
    
    struct Node {
        int s, e;
        int id;
        friend bool operator < (const Node & a, const Node & b)  {
            return a.e > b.e;
        }
    }cows[MAX];
    
    int use[MAX];
    
    bool cmp (Node & a, Node & b){
        return a.s < b.s;
    }
    
    priority_queue<Node> q;
    
    int main(){
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; i++){
            scanf("%d%d", &cows[i].s, &cows[i].e);
            cows[i].id = i;
        }
        sort(cows, cows + n, cmp);
        int ans = 0;
        for(int i = 0; i < n; i++){
            q.push(cows[i]);
            if(!q.empty() && q.top().e < cows[i].s){
                use[cows[i].id] = use[q.top().id];
                q.pop();
            }
            else{
                ans ++;
                use[cows[i].id] = ans;
            }
        }
        printf("%d
    ", ans);
        for(int i = 0; i < n; i++){
            printf("%d
    ",use[i]);
        }
        return 0;
    }
    

    参考:https://www.cnblogs.com/aiqinger/p/12587625.html

  • 相关阅读:
    C# 利用StringBuilder提升字符串拼接性能
    T420 开启麦克风
    理解数据库中的undo日志、redo日志、检查点
    网络编程api总结
    源码剖析Linux epoll实现机制及Linux上惊群
    linux信号的处理--部分源码分析
    git使用笔记-提高篇-重置揭密
    git使用笔记-比较分支差异
    git使用笔记-提高篇
    ubuntu安装软件依赖解决
  • 原文地址:https://www.cnblogs.com/zhangyue123/p/12626459.html
Copyright © 2020-2023  润新知