【九度OJ】题目1178:复数集合 解题报告
【九度OJ】题目1178:复数集合 解题报告
标签(空格分隔): 九度OJ
http://ac.jobdu.com/problem.php?pid=1178
题目描述:
一个复数(x+iy)集合,两种操作作用在该集合上:
1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;
2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;
最开始要读入一个int n,表示接下来的n行每一行都是一条命令。
输入:
输入有多组数据。
每组输入一个n(1<=n<=1000),然后再输入n条指令。
输出:
根据指令输出结果。
样例输入:
3
Pop
Insert 1+i2
Pop
样例输出:
empty
SIZE = 1
1+i2
SIZE = 0
提示:
模相等的输出b较小的复数。
a和b都是非负数。
Ways
挺难的一个题目。首先这是个排序问题,按照模以及b的值进行排序:
如果从大到小排序,满足大>小的条件是返回true
第二个注意删除节点的时候,如果还用size和sort就不好弄了,因为这样做是清零了一个节点。可以简单粗暴的移动就好了。
第三个注意数字量输入:scanf("%d+i%d", &nums[size].a, &nums[size].b);
,可以直接读到最后的一个位置,两个%d直接把数据读了出来。
细节很多,处处注意。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Num {
int a, b;
} nums[1000];
bool cmp(Num x, Num y) {//
int temp = (x.a * x.a + x.b * x.b) - (y.a * y.a + y.b * y.b);//
if (temp == 0) {
return x.b < y.b;
} else {
return temp > 0;
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int size = 0;
while (n--) {
char cmd[100];
scanf("%s", cmd);
if (cmd[0] == 'P') {//POP
if (size == 0) {
printf("empty\n");
} else {
sort(nums, nums + size, cmp);
printf("%d+i%d\n", nums[0].a, nums[0].b);
for (int i = 0; i < size - 1; i++) {//删除
nums[i] = nums[i + 1];
}
size--;
printf("SIZE = %d\n", size);
}
} else {//Insert
scanf("%d+i%d", &nums[size].a, &nums[size].b);//数字输入
size++;
printf("SIZE = %d\n", size);
}
}
}
return 0;
}
Date
2017 年 3 月 17 日