这道题做了我挺久,主要是优先队列中要用到结构体类型,而我对结构体不是特别熟。。。
当然,最后还是看了下别人的代码,最终才写出来。。。
只是对于operator < 操作符的重载虽然基本理解,但还不够深刻。。
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4402 Accepted Submission(s): 1814
7 IN 1 1 IN 1 2 OUT 1 OUT 2 IN 2 1 OUT 2 OUT 1 2 IN 1 1 OUT 1
2 EMPTY 3 1 1
代码如下:
#include<cstdio> #include<queue> using namespace std; struct T { int num,id; }t; bool operator < (const T &c,const T &d)//重载"<"操作符,指定优先规则(排序规则) { if(c.num!=d.num) return c.num<d.num;//先比较num,由大到小排序 else return c.id>d.id;//如果num相同,比较id,由小到大 } int main() { int n,a,b; char x[5]; while(~scanf("%d",&n)) { int k=1,i=0; priority_queue<T> q[4];//定义结构体类型的优先队列 while(n--) //优先队列默认元素的值由大到小排序 { scanf("%s %d",x,&a); if(x[0]=='I') { scanf("%d",&b); t.num=b; t.id=k++; q[a].push(t);//把整个结构体内容插入队列 } else { if(!q[a].empty()) { t=q[a].top();//从队首取出整个结构体内容 q[a].pop(); printf("%d\n",t.id);//输出结构体中的id的值 } else printf("EMPTY\n"); } } } return 0; }
注意优先队列(其它的的应该有点不同)结构体重载的写法(仔细看清楚):
struct Node { int num, val; char s[210]; friend bool operator < (Node a, Node b) { if(a.val == b.val) return a.num > b.num; //num从小到大排 return a.val < b.val; //val从大到小排 } }node[N];
struct Node { int num, val; char s[210]; bool operator < (const Node &a) const{ if(a.val == val) return a.num < num; //num从小到大排 return a.val > val; //val从大到小排 } }node[N];