zoukankan      html  css  js  c++  java
  • 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
    ", ans);
        for (int i = 0; i < n; i++)
            printf("%d
    ", num[i] + 1);
        return 0;
    }

                

    君子知命不惧,自当日日自新
  • 相关阅读:
    HihoCoder 1245:王胖浩与三角形 三角形边长与面积
    C++ 读写注册表
    Codestorm:Counting Triangles 查各种三角形的个数
    2015年10月之 叽里咕噜
    HDU 5523:Game
    Codestorm:Game with a Boomerang
    关于GPU-driver for linux的资料
    ACER NV47H75C 安装CUDA 驱动以及调整屏幕
    服务器GTX590安装CUDA
    观后感,读了几篇博文
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9400784.html
Copyright © 2011-2022 走看看