给你一个复数集合{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<vector> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef struct node { int x,y; }Node; bool cmp(Node a,Node b) { double m=sqrt(a.x*a.x+a.y*a.y); double n=sqrt(b.x*b.x+b.y*b.y); return m>n; } int main() { int t; while(~scanf("%d",&t)) { while(t--) { int n,i; scanf("%d",&n); vector<Node> vec; char op[10]; while(n--) { int x,y; scanf("%s",op); if(op[0]=='P') { if(vec.size()==0) printf("Empty!\n"); else { sort(vec.begin(),vec.end(),cmp); printf("%d+i%d\n",vec[0].x,vec[0].y); vec.erase(vec.begin()); if(vec.size()>0) printf("Size: %d\n",vec.size()); else printf("Empty!\n"); } } else { Node node; scanf("%d+i%d",&node.x,&node.y); vec.push_back(node); printf("Size: %d\n",vec.size()); } } } } }
原文:http://blog.csdn.net/ruzhuxiaogu/article/details/44572799