POJ 3190 (贪心)

解决牛挤奶时间冲突的问题,通过排序和优先队列实现最少机器分配。采用贪心算法,确保每个时间段内的挤奶需求得到满足的同时,尽可能减少使用的机器数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

有n头牛,每头牛挤奶的时间段是不同的,现在问在不同的时间段中最少用多少机器才能满足。

思路:

首先这是贪心类型1的题:被称为 staying ahead,即保持领先,意义为如果我们运用某个策略,在算法的每一步中都使某个条件保持领先,那么最后可以利用这个领先条件来证明最优解。


这里用两个策略:

  1. 按照开始时间进行排序,这样可以遍历每一种情况
  2. 按照每次结束的时间最早的寻找满足无交叉的时间段。

若时间无交叉则可以用一样的机器,若时间有交叉需要添加机器。 用record记录第c头牛用第几台机器。

注意:

第一策略需要排序很简单,但是第二种需要注意使用方法。

#include<iostream>
#include<queue>

using namespace std;

class Node
{
public:
    int x,y;
    friend operator<(Node a,Node b)
    {
        return a.x > b.x;   //top指向的是队首
    }
};

int main()
{
    Node temp;
    temp.x = 3;
    temp.y = 2;
    priority_queue<Node>Q;
    Q.push(temp);
    temp.x = 2;
    temp.y = 2;
    Q.push(temp);
    while(!Q.empty()){
        cout<<Q.top().x<<" "<<Q.top().y<<endl;
        Q.pop();
    }
    return 0;
}

源码:

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>

using namespace std;

class Node
{
public:
    int x,y;
    int c;
    friend bool operator<(Node a,Node b)
    {
        return a.y > b.y;
    }
}cow[50005];

int cmp(Node a,Node b)
{
    return a.x < b.x;
}

int record[50005];

int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n; i++){
        scanf("%d%d",&cow[i].x,&cow[i].y);
        cow[i].c = i;
    }
    sort(cow,cow+n,cmp);
    priority_queue<Node>Q;
    Q.push(cow[0]);
    int ans = 0;
    record[cow[0].c] = ++ans;
    for(int i = 1;i < n; i++){
        Node temp = Q.top();
        if(temp.y < cow[i].x){
            record[cow[i].c] = record[temp.c];
            Q.pop();
            Q.push(cow[i]);
        }
        else {
            record[cow[i].c] = ++ans;
            Q.push(cow[i]);
        }
    }
    cout<<ans<<endl;
    for(int i = 0;i < n; i++){
        cout<<record[i]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值