L1_012关于堆的判断(stl中关于堆的函数的使用)

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
“x is the root”:x是根结点;
“x and y are siblings”:x和y是兄弟结点;
“x is the parent of y”:x是y的父结点;
“x is a child of y”:x是y的一个子结点。


输入格式:
每组测试第1行包含2个正整数N(<= 1000)和M(<= 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。
输出格式:
对输入的每个命题,如果其为真,则在一行中输出“T”,否则输出“F”。


输入样例:
5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
输出样例:
F
T
F
T


  • 这道题我就很偷懒的用了algorithm里的关于堆的函数了,没有自己写堆的构造部分。。
    然后部分正确,有两个注意点
    1.注意题目中说的是将一系列给定数字顺序插入一个初始为空的小顶堆H[]。说明是没读入一个数字就要进行堆的调整的,并不是所有数字都输完之后再将向量调整成堆党的,这两种方式剑起来的堆是不一样的
    2.判断是否是兄弟节点时,不仅仅要索引值相差1,大的哪个索引还必须是偶数才行
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
bool comp(int a, int b)
{
    return a > b;
}
int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> nums;
    for (int i = 0; i < n; ++i)
    {
        int x; cin >> x;
        nums.push_back(x);
        make_heap(nums.begin(), nums.end(), comp);
        //每插入一个元素就调整一下堆
        //而不是等所有元素输完了再调整成堆
        //这两种方式最后形成的堆是有差别的
    }
    
    string cmd;
    getline(cin, cmd);//把输数字那行的换行符读掉
    for (int i = 0; i < m; ++i) {
        getline(cin, cmd);
        istringstream is(cmd);
        if (i)
            cout << endl;
        string ts;
        if (cmd.find("root") != string::npos) {
            int x;
            is >> x;
            if (nums[0] == x)
                cout << "T";
            else
                cout << "F";
        }
        if (cmd.find("siblings") != string::npos) {
            int x, y;
            is >> x;
            is >> ts >> y;
            int ix=n+1, iy=n+1;
            //若只找到其中一个点则与另一个点的差绝对大于1
            //若两个都没找到差就是0
            for (int j = 0; j < n; ++j) {
                if (nums[j] == x)
                    ix = j;
                if (nums[j] == y)
                    iy = j;
                if (ix != n + 1 && iy != n + 1)
                    break;
            }
            if (ix - iy == 1) {
                if (ix % 2 == 0)
                    cout << "T";
                else
                    cout << "F";
            }
            else if (iy - ix == 1) {
                if (iy % 2 == 0)
                    cout << "T";
                else
                    cout << "F";
            }
            else
                cout << "F";
        }
        if (cmd.find("parent") != string::npos) {
            int x, y;
            is >> x;
            is >> ts >> ts >> ts >> ts >> y;
            int ix = n + 1, iy = n + 1;
            //若只找到其中一个点则与另一个点的差绝对大于1
            //若两个都没找到差就是0
            for (int j = 0; j < n; ++j) {
                if (nums[j] == x)
                    ix = j;
                if (nums[j] == y)
                    iy = j;
                if (ix != n + 1 && iy != n + 1)
                    break;
            }
            if (ix != n + 1 && iy != n + 1) {
                //两个都找到了
                if (iy == 2 * ix + 1 || iy == 2 * ix + 2)
                    cout << "T";
                else
                    cout << "F";
            }
            else
                cout << "F";
        }
        if (cmd.find("child") != string::npos) {
            int x, y;
            is >> x;
            is >> ts >> ts >> ts >> ts >> y;
            int ix = n + 1, iy = n + 1;
            //若只找到其中一个点则与另一个点的差绝对大于1
            //若两个都没找到差就是0
            for (int j = 0; j < n; ++j) {
                if (nums[j] == x)
                    ix = j;
                if (nums[j] == y)
                    iy = j;
                if (ix != n + 1 && iy != n + 1)
                    break;
            }
            if (ix != n + 1 && iy != n + 1) {
                //两个都找到了
                if (ix == 2 * iy + 1 || ix == 2 * iy + 2)
                    cout << "T";
                else
                    cout << "F";
            }
            else
                cout << "F";
        }
    }
    system("pause");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,788评论 0 38
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,526评论 5 4
  • 基本思路 首先你得画三个圆吧,那三个圆怎么重叠到一块呢?这个就得靠-margin来控制了。 css 结果 怎么理解...
    鸭梨山大哎阅读 2,798评论 0 2
  • 【原创】 这是感冒的第二天,输完液,他依旧病恹恹的,在床上愣了好一会,有些吃力的坐了起来,穿上鞋,系了个松垮...
    南瑜ny1988阅读 331评论 0 2
  • Remember state (on or off). Switch patches are like light...
    刘板栗阅读 725评论 0 0