您的位置:首页 > 其它

POJ4144畜栏保留问题

2020-05-11 04:09 447 查看

盲点:
1、优先队列
和队列相似,但是更像是一个大顶堆。top()是获取队列中优先级最大的那个元素,pop也是把优先级最大的这个元素出队
定义 priority_queue q;

2、重载运算符
bool operator < (const Node &n1,const Node &n2)
{
return n1.r>n2.r;//谁的r越大谁就越小
// return n1.r<n2.r//谁的r越小谁就越小
}

在结构体内重载
struct Node{//奶牛结构体,开始时间、结束时间、编号
int l,r,pos;
bool operator < (const Node &a)const
{
return r>a.r;//r越大 优先级越小
}
};

类似于银行排队系统。

思路;由于每头牛都得挤奶,按照挤奶时间前后顺序排序

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

using namespace std;

struct Node{//奶牛结构体,开始时间、结束时间、编号
int l,r,pos;
bool operator < (const Node &a)const
{
return r>a.r;//r越大 优先级越小
}
};
priority_queue <Node> q;//优先队列,作用有点像作为畜栏。

Node t[50010];
int cow[50010];//cow[i]存放第i头牛在被挤奶的畜栏编号

bool cmp(Node n1,Node n2)
{
if(n1.l==n2.l)
return n1.r<n2.r;
else
return n1.l<n2.l;
}
int main(){

int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&t[i].l,&t[i].r);
t[i].pos=i;
}

sort(t,t+n,cmp);//按照开始时间排序
int ans=0;//一共需要多少个畜栏

for(int i=0;i<n;i++)//顺序开始,查看是否需要新畜栏
{
if(!q.empty()&&q.top().r<t[i].l)//注意 这里不能等于,q.top是获取优先队列q中r最小的那个畜栏。
{
cow[t[i].pos]=cow[q.top().pos];
q.pop();
}
else
{

cow[t[i].pos]=++ans;
}
q.push(t[i]);
}

printf("%d\n",ans);
for(int i=0;i<n;i++)
printf("%d\n",cow[i]);

}

若有哪里不对,各位老师请指点。

将输入案例手动走一遍

铁柱铁柱 原创文章 8获赞 0访问量 231 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: