北邮OJ-108. 虚数-11网研上机B

本文介绍了一个使用C++实现的程序,该程序通过优先队列处理复数集合的操作,包括插入复数并返回集合大小以及移除模值最大的复数。程序运用了自定义的复数结构体,并重载了比较运算符来实现模值的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 关于优先队列priority_queue,无论是小根堆还是大根堆,其排序时候调用的运算符都是<,故对结构体重载<即可
  2. 对stack、queue等,top()方法返回的是一个常引用噢!(由栈、队列的性质所决定)。所以要调用这个常引用的方法就得把方法写成常成函数!

题目描述
给你一个复数集合{Aj+i*Bj},保证Aj和Bj都是整数,初始为空集。

每次会给你如下两种操作中的一种:

   1."Insert x+iy",其中x,y都是整数。表示在集合中加入一个复数 x+iy,同时输出此时集合的大小;

   2."Pop"。如果集合为空集直接返回“Empty!”,如果有元素则以"x+iy"的形式显示集合中模值最大的复数,然后将该元素从集合中删除,之后在第二行显示操作之后的集合大小,如果为空集则显示“Empty!”。

输入格式
第一行只有一个数T,代表case数。0<=T<=10

每一组case:

   第一行有一个整数n,表示这组case中一共有n条命令 0<n<=100

   接下来n行每行有一个命令,命令如上所述

保证不会输入两个模值同样的元素,并保证实部虚部都大于0,小于1000。

输出格式
依照上述原则输出每一个命令对应的输出

如果输入命令是Insert命令,则对应的输出占一行为集合大小;

如果输入命令是Pop命令,则对应的输出占一行或者两行,为模值最大的复数和集合大小。

请注意,输出集合大小的格式为”Size:空格x回车”,x为集合大小

输入样例
1
5
Pop
Insert 1+i2
Insert 2+i3
Pop
Pop
输出样例
Empty!
Size: 1
Size: 2
2+i3
Size: 1
1+i2
Empty!

#include <iostream>
#include <cstdio> 
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct Complex{
    int real;
    int imag;
    int mod;
    Complex(){
    }
    Complex(int real,int imag){
        this->real=real;
        this->imag=imag;
        mod=real*real+imag*imag;
    }
    bool operator<(const Complex c)const{
        return mod<c.mod;
    }
    bool operator>(const Complex c)const{//回头研究 
        return mod>c.mod;
    }
    void print()const{//回头研究 
        printf("%d+i%d\n",real,imag);
    }
}; 
priority_queue<Complex> coms;

void insert(){
    int x,y;
    scanf("%d+i%d",&x,&y);
    coms.push(Complex(x,y));
    printf("Size: %d\n",coms.size());
}
void pop(){
    if (coms.empty())
        printf("Empty!\n");
    else{
        coms.top().print(); 
//      Complex &temp=coms.top();
//      printf("%d+i%d\n",temp.real,temp.imag);
        coms.pop();
        if (coms.empty())
            printf("Empty!\n");
        else
            printf("Size: %d\n",coms.size());
    }
}
int main(){
    int t,n;
    char operation[20];
    scanf("%d",&t);
    while (t--){
        //initiate
        while (!coms.empty())
            coms.pop();
        //input
        scanf("%d",&n);
        //operation
        for (int i=0;i<n;i++){
            scanf("%s",operation);
            switch(operation[0]){
                case 'I':
                    insert();
                    break;
                case 'P':
                    pop();
                    break;
            }
        }
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值