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]); }
若有哪里不对,各位老师请指点。
将输入案例手动走一遍
相关文章推荐
- 关于double类型保留小数的问题
- mysql中的保留字段产生的问题
- 解决mysql数据重复问题-只保留一条数据
- Double类型的数字保留位数问题
- 关于数据库中保留小数位的问题
- ArcGIS Server重装后保留原有服务的问题
- java中如何使Double类型的数值保留两位小数问题
- 曾经面试给问到了Java保留小数问题
- 解决windows的socket长时间保留在time_wait状态问题
- java开发中select下拉列表在查询操作中保留查询条件问题
- 关于java格式化数据,保留两位小数不精准的问题
- 关于保留小数位数的问题
- C# double小数点位数保留问题
- 知识共享平台开发——小细节【分数保留小数点问题】
- Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
- java保留两位小数问题
- 整形的小数保留问题
- 状态保留之session存储问题
- jpa 原生查询createNativeQuery里面有冒号保留字关键字的问题
- java保留2位小数问题