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

773

被折叠的 条评论
为什么被折叠?



