时间限制 1000 ms 内存限制 65536 KB
题目描述
给你一个复数集合{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为集合大小
代码:
#include<iostream>
#include <cstdio>
#include <string>
//#include <algorithm>
#include <vector>
#include<cstring>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX=101;
char a[15];
int num=0;
struct Node
{
int s;
int x;
int m;
}node[MAX];
bool Cmp(Node a,Node b)
{
return a.m<b.m;
}
void insert(int a,int b)
{
node[num++].s=a;
node[num-1].x=b;
node[num-1].m=a*a+b*b;
printf("Size: %d\n",num);
}
void pop()
{
if(num==0)
printf("Empty!\n");
else
{
sort(node,node+num,Cmp);
printf("%d+i%d\n",node[num-1].s,node[num-1].x);
num--;
if(num==0)
printf("Empty!\n");
else
printf("Size: %d\n",num);
}
}
int main()
{
int t,n,s,x;
scanf("%d",&t);
while(t--)
{
num=0;
priority_queue<int> que;
memset(node,0,sizeof(node));
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
if(strcmp(a,"Insert")==0)
{
scanf("%d+i%d",&s,&x);
insert(s,x);
}else pop();
}
}
}