TZOJ 5371: C++实验:STL之priority_queue3 优先队列,重载运算符

描述

 

使用STL中的优先队列,将n个点按照横坐标从小到大顺序排序,如果横坐标相同,按照纵坐标从小到大排序。

部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。

 

  • C++
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        Input();
        while(!qu.empty())
        {
            Point p = qu.top();
            cout<<p.x<<" "<<p.y<<endl;
            qu.pop();
        }
    }
    return 0;
}

 

输入

 

输入数据有多组,第一行为t,接下来有t组数据。

每组的第一行为正整数n,接下来有n行,每行一个点,包含横坐标和纵坐标,均为整数。

 

输出

 

每组输出排序后的所有点,每行一个点。

 

样例输入

 

2
3
3 2
2 3
4 1
4
1 2
3 3
1 1
3 2

样例输出

 

2 3
3 2
4 1
1 1
1 2
3 2
3 3

AC感想:莫名其妙的就AC,先记录下,有很多不懂的地方,比如结构体里重载运算符friend bool operator <(Point a,Point b)改来改去发现这居然是个固定写法,就里面friend删不掉,重载的<也不能用大于号或者空括号代替,具体原因请大佬指教

学到了一点,定义结构体队列priority_queue<Point> qu;,只需要在<>里写结构体名称即可,push的时候也push个结构体进去就行;这么多题队列做下来,感觉对于队列的定义才是最重要的,入队出队之类的方法反而是次要的。

#include<bits/stdc++.h>
using namespace std;
struct Point{
    int x,y;
    friend bool operator <(Point a,Point b)//好像是固定写法? 
    {
        if(a.x==b.x)return a.y>b.y;//因为重载运算符operator那里是固定的就只能修改这里的大小于号了 
        else return a.x>b.x;
    }
}a; 
priority_queue<Point> qu;
void Input()
{
    int m;
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a.x>>a.y;
        qu.push(a);
    }
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        Input();
        while(!qu.empty())
        {
            Point p = qu.top();
            cout<<p.x<<" "<<p.y<<endl;
            qu.pop();
        }
    }
    return 0;
}

 

posted @ 2022-06-17 16:01  CRt0729  阅读(40)  评论(0编辑  收藏  举报