藍橋杯第十屆真題 修改陣列(兩種思路)

2021-10-19 14:20:07 字數 1492 閱讀 4646

題目鏈結

vis 陣列統計每個數被訪問的次數,如果乙個數被訪問了 k 次,則該數的後 k 個數一定都存在,則直接跳轉到 k 後面繼續判斷。

還有需要注意的是:在輸入輸出資料很大的時候,建議使用 scanf 和 printf 取代 cin 和 cout,不然可能會超時。這道題就是。

#include

using namespace std;

const

int maxnum =

1000005

;int vis[maxnum]

;int

main()

vis[num]=1

;printf

("%d "

, num);}

return0;

}

對於同樣的思路,如果使用 map 則會超時,因為使用 或 find 成員函式訪問時都是要遍歷查詢的,沒有普通陣列那麼快。

#include

#include

using namespace std;

intmain()

nums[num]=1

;printf

("%d "

, num);}

return0;

}

思路:對於所有的數,起初他們的根節點都指向自己,表示沒出現過。當遇到乙個數時,找到他的根節點,由於根節點始終是未出現過的,所以輸出根節點,接著把根節點再指向乙個新的根節點(比舊的根節點大 1),這樣就能始終保持根節點是未出現過的了。

在查詢根節點的同時使用路徑壓縮,可以更快的查詢到根節點。

6

1 2 3 4 1 3

遇到 1,1 的根節點是 1,輸出 1,指向新的根節點 2,也就是 par[1] = 1 + 1;

遇到 2,2 的根節點是 2,輸出 2,指向新的根節點 3

遇到 3,3 的根節點是 3,輸出 3,指向新的根節點 4

遇到 4,4 的根節點是 4,輸出 4,指向新的根節點 5

遇到 1,1 的根節點是 5,輸出 5,指向新的根節點 6

遇到 3,3 的根節點是 6,輸出 6,指向新的根節點 7

#include

using namespace std;

const

int maxnum =

1000005

;int par[maxnum]

;void

init()

intfind

(int x)

intmain()

return0;

}

普通陣列:228ms

並查集:39ms

[藍橋杯][2019 年第十屆真題]修改陣列-題解(c++**)-dotcpp 程式設計社群

[藍橋杯][2019 年第十屆真題]修改陣列-題解(c++**)(鍊錶式並查集 + 這是什麼神仙演算法)-dotcpp 程式設計社群

藍橋杯 2023年第十屆真題 修改陣列

藍橋杯 2019年第十屆真題 修改陣列 時間限制 1sec 記憶體限制 128mb 提交 234 解決 36 題目描述 給定乙個長度為 n 的陣列 a a1,a2,an 陣列中有可能有重複出現 的整數。現在小明要按以下方法將其修改為沒有重複整數的陣列。小明會依次修改 a2,a3,an。當修改 ai ...

第十屆藍橋杯省賽A組(C C 組)修改陣列

每輸入乙個數就用visit陣列記錄這個數已經輸入過了的記錄,這樣輸入下乙個數的時候,判斷一下是否是前面有的數。這是保留流做法,耗記憶體。include includeusing namespace std bool visit 10000 用陣列記錄乙個數是否被使用過 int main visit ...

2019第十屆藍橋盃國賽c B組真題

正確答案還沒出來,有寫 的部分僅屬於自己的見解。持續更新中.請找到兩個正整數x和y滿足下列條件 1 2019思路 直接暴力,sqrt函式會丟失精度,把找到的值再平方一下看看是否構成等差數列,找到的第一對 x,y值為即為答案。include includeusing namespace std int...