POJ-3190-Stall Reservations

博客介绍了如何利用贪心算法解决POJ-3190问题,即在农场中用最少的栅栏分隔产奶的奶牛,保证它们在产奶时不被打扰。通过将问题转化为线段不相交的分组问题,利用优先队列进行高效求解。

本题地址:http://poj.org/problem?id=3190

本题大意如下:

在一个农场有一群奶牛(它们可以被栅栏分开),它们分别会在某个时间段产奶,但要求是产奶时不会被其它的奶牛打扰!现农场栅栏有限,求最少需要多少个栅栏能让它们将牛奶顺利产完!


把这道题数学化:给你n条线段,问最少需要分成几组,使得每组中的线段互不相交!!!


这个题使用优先队列来解决是很方便的!
代码如下:


#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
struct COW
{
    int z,y,p;
    bool operator<(const COW &cows)const
    {
        return y>cows.y;//右区间值小的先出对列!
    }
} cow[52014];
priority_queue<COW>Q;
int cmp(COW a,COW b)
{
    if(a.z==b.z)
        return a.y<b.y;
    return a.z<b.z;
}
int main()
{
    int n,num=1;//初始化当前栅栏的个数!;
    cin>>n;
    int pos[52014];//这个数组是用来存栅栏编号的!
    for(int i=0; i<n; i++)
    {
        cin>>cow[i].z>>cow[i].y;
        cow[i].p=i;//先记住位置,因为后面会进行排序,到时原来的顺序会改变!
    }
    sort(cow,cow+n,cmp);
    pos[cow[0].p]=num;
    Q.push(cow[0]);
    for(int i=1; i<n; i++)
    {
        if((!Q.empty())&&cow[i].z>Q.top().y)
        {
            pos[cow[i].p]=pos[Q.top().p];
            Q.pop();//表示两个区间此时有无交集,上一区间的右区间比下一区间的左区间值小,可以共用一个栅栏!
            //否则需要再开辟一个栅栏!
        }
        else
            pos[cow[i].p]=++num;
        Q.push(cow[i]);
    }
    cout<<num<<endl;
    for(int i=0; i<n; i++)
        cout<<pos[i]<<endl;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值