【九度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 日

posted @ 2017-03-17 15:29  负雪明烛  阅读(29)  评论(0编辑  收藏  举报