L2 012 關於堆的判斷

2021-07-29 09:30:36 字數 1342 閱讀 5373

題目:

1.按題目要求先將傳進來的數按順序插入,每插入乙個新的元素就要從下向上調整,邊插入邊調整,不能全部插入後再從上到下調整。

2.得到調整好的堆後,對輸入的指令字串進行分析,取出其中的數字,並判斷是題目所給的四類命題的哪一類

在這裡我採用按空格分幾個部分輸入字串的形式獲取字串中的數字

例如輸入:

24 is the root

26 and 23 are siblings

46 is the parent of 23

23 is a child of 10

先輸入第乙個數字, 然後判斷字串是否為and ,是就是命題二的形式,則按" %d are siblings",輸入即可拿到數字

如果不是 則判斷下乙個字串,如果是"a"則是命題四的形勢,按" child of %d"輸入拿到數字,以此類推

3.根據座標位置,判斷命題是否正確

`x is the root ,判斷x是不是根節點,與a[0]即可

`x and y are siblings ,判斷x和y是不是兄弟,即判斷x和y是否有同乙個父親,關係為:(posx-1)/2 ==(posy-1)/2

`x is the parent of y ,x是y的父結點,關係為: (posy-1)/2==posx

`x is a child of y ,x是y的子女,關係為:(posy*2+1)==posx || (posy*2+2)==posx

**如下:

#include#include/*

void siftdown(int a,int start,int end)

if(x<=a[j])

a[i]=a[j];

i=j;

j=2*i+1;

} a[i]=x;

}void heapsort(int a,int start,int end)

}*/void siftup(int a,int start)

else

i=j;

j=(i-1)/2;

} a[i]=x;

}void find(int a,int n,int key1,int key2,int* pos1,int* pos2)

if(a[i]==key2)

if(*pos1閱讀題目不仔細,沒有邊插入邊排序,搞了我快一天的時間

2.再者,以後分析輸入字串,就用按空格分段輸入,這樣容易理解,只要縝密就不會出錯。

3.話不多說,我趕緊去把堆排序再碼一遍

問題:1.其實這裡我有個疑問,用siftdown()調整和siftup()調整得到的堆會不一樣嗎?

2.題目所給的值應該都是互不相同的把?

L2 012 關於堆的判斷

題目如下 時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元...

L2 012 關於堆的判斷

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 ...

L2 012 關於堆的判斷

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 ...