复数集合问题

复数集合

描述
一个复数(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

分析:

因为涉及多次输入输出且要求有序,
采用了优先队列的重载运算符
具体做法可见优先队列笔记

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x,flag,a[1010],sum;
string s;
struct compare{
	int real;//实部 
	int imag;//虚部 
}; 	
//当左边的模小于右边的模时触发交换
	bool operator < (compare lhs,compare rhs){//构建的为模大根堆 
		return lhs.real*lhs.real+lhs.imag*lhs.imag<rhs.real*rhs.real+rhs.imag*rhs.imag;
	}

int main(){
	while(cin>>n){
		priority_queue<compare> q;
		while(n--){
			cin>>s;//cin以空格为界可以分割开insert和a+b; 
			if(s=="Pop"){
				if(q.empty())
                    cout<<"empty"<<endl;
		        else{
		    	    printf("%d+i%d\n",q.top().real,q.top().imag);
		    	    q.pop();
		    	    printf("SIZE = %d\n",q.size());
			    }
			}   
			else{
				int a,b;
				scanf("%d+i%d",&a,&b);
				compare c;
				c.real=a;
				c.imag=b;
				q.push(c);
				printf("SIZE = %d\n",q.size());
			}
		    
		} 
	}
	return 0;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值