- 关于优先队列priority_queue,无论是小根堆还是大根堆,其排序时候调用的运算符都是<,故对结构体重载<即可
- 对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;
}