牛客網 複數集合(小根堆的優先佇列、北郵機試)

sunlanchang發表於2019-01-31

題目描述

一個複數(x+iy)集合,兩種操作作用在該集合上: 1、Pop 表示讀出集合中複數模值最大的那個複數,如集合為空 輸出 empty ,不為空就輸出最大的那個複數並且從集合中刪除那個複數,再輸出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示實部和虛部),將a+ib加入到集合中 ,輸出集合的大小SIZE; 最開始要讀入一個int n,表示接下來的n行每一行都是一條命令。

輸入描述:

輸入有多組資料。
每組輸入一個n(1<=n<=1000),然後再輸入n條指令。
輸出描述:
根據指令輸出結果。

模相等的輸出b較小的複數。
a和b都是非負數。
示例1

輸入

3
Pop
Insert 1+i2
Pop

輸出

empty
SIZE = 1
1+i2
SIZE = 0

Solution

優先佇列預設大根堆,這裡使用小根堆的優先佇列,struct過載小於號即可,注意過載的形式不能錯。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 1111;
struct Complex_num
{
    int a, b;
    // 使用queue排序時一定要用
    // bool operator<(const Class &tmp)cosnt這種格式
    bool operator<(const Complex_num &t) const
    {
        return a * a + b * b < t.a * t.a + t.b * t.b;
    }
};
int main()
{
    freopen("in.txt", "r", stdin);
    int T;
    char str[10];
    priority_queue<Complex_num> Q;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%s", str);
        Complex_num tmp;
        if (strcmp(str, "Pop") == 0)
        {
            if (Q.size() == 0)
                printf("empty\n");
            else
            {
                tmp = Q.top();
                printf("%d+i%d\n", tmp.a, tmp.b);
                Q.pop();
                printf("SIZE = %d\n", int(Q.size()));
            }
        }
        else if (strcmp(str, "Insert") == 0)
        {
            scanf("%d+i%d", &tmp.a, &tmp.b);
            Q.push(tmp);
            printf("SIZE = %d\n", int(Q.size()));
        }
    }
    return 0;
}

相關文章