poj 3190 奶牛挤奶问题 贪心算法

题意:奶牛挤奶问题,每只奶牛在[a,b]的时间内挤奶,要求挤奶的过程中不能不打扰,且只能自己一个人独享挤奶的机器。问最少需要多少个挤奶的机器?

思路:

  1. 对奶牛挤奶开始的时间从小到大开始排序。
  2. 将正在工作的奶牛放在"队列"中,这里采用的是"优先队列"
  3. 如果后面的一个奶牛的开始时间大于在队列中工作的结束时间,则不需要加机器,只需要将正在工作的奶牛pop出去,然后放入新的奶牛  否则要加机器

代码中对思路3的实现

pq.push(cow[0]);
    for (int i = 1; i < n; i++)
    {
        Cow t = pq.top();
        if (cow[i].b > t.e)
        {
            pq.pop();
            num[cow[i].id] = num[t.id];
        }
        else
        {
            num[cow[i].id] = ans++;
        }
        pq.push(cow[i]);
    }

注意点:

  • 本题需要奶牛的序号即id 所以需要保存每只奶牛的id才方便后面的使用,不然排序一下,id全部改变了.
  • 排序的时候如果相同的开始时间,就按照结束时间由小到大排序
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
struct Cow {
    int id, b, e;
    bool friend operator<(Cow a, Cow b)
    {
        return a.e > b.e;
    }
}cow[50001];
int cmp(Cow a, Cow b)
{
    if (a.b == b.b)
    {
        a.e < b.e;
    }
    return a.b < b.b;
}
int main()
{
    int n;
    int ans = 0, num[50001];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        cow[i].id = i;
        scanf("%d%d", &cow[i].b, &cow[i].e);
    }
    sort(cow, cow + n, cmp);
    priority_queue<Cow> pq;
    num[cow[0].id] = ans++;
    pq.push(cow[0]);
    for (int i = 1; i < n; i++)
    {
        Cow t = pq.top();
        if (cow[i].b > t.e)
        {
            pq.pop();
            num[cow[i].id] = num[t.id];
        }
        else
        {
            num[cow[i].id] = ans++;
        }
        pq.push(cow[i]);
    }
    printf("%d\n", ans);
    for (int i = 0; i < n; i++)
        printf("%d\n", num[i] + 1);
    return 0;
}

 

            

 

posted @ 2018-08-01 13:45  徐小晋  阅读(711)  评论(0编辑  收藏  举报