贪心 - bailian 4144:畜栏保留问题

题目

总时间限制: 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\n", ans);
    for(int i = 0; i < n; i++){
        printf("%d\n",use[i]);
    }
    return 0;
}

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

猜你喜欢

转载自www.cnblogs.com/zhangyue123/p/12626459.html