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

2021-10-22 23:54:27 字數 1813 閱讀 7669

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

時間限制: 1sec 記憶體限制: 128mb 提交: 234 解決: 36

題目描述

給定乙個長度為 n 的陣列 a = [a1, a2, · · · an ],陣列中有可能有重複出現 的整數。

現在小明要按以下方法將其修改為沒有重複整數的陣列。小明會依次修改 a2,a3,··· ,an。

當修改 ai 時,小明會檢查 ai 是否在 a1 ∼ ai−1 **現過。如果出現過,則 小明會給 ai 加上 1 ;如果新的 ai 仍在之前出現過,小明會持續給 ai 加 1 ,直 到 ai 沒有在 a1 ∼ ai−1 **現過。

當 an 也經過上述修改之後,顯然 a 陣列中就沒有重複的整數了。 現在給定初始的 a 陣列,請你計算出最終的 a 陣列

輸入第一行包含乙個整數 n。 第二行包含n個整數a1,a2,··· ,an

輸出輸出n個整數,依次是最終的a1,a2,··· ,an。

樣例輸入

52 1 1 3 4

樣例輸出

2 1 3 4 5

提示對於 80% 的評測用例,1 ≤ n ≤ 10000。

對於所有評測用例,1 ≤ n ≤ 100000,1 ≤ ai ≤ 1000000。

分析:這道題就是查重類題目,我們可以這樣想,我們定義乙個訪問陣列visited,開始都設定為0,表示未被訪問的狀態。如果當輸入乙個數x,若沒被訪問,則直接儲存,並將visited【x】設定為1,如果x已經被訪問則將x=x+1,直到visited【x】沒有被訪問,然後儲存進陣列。這樣做有乙個缺點。如果輸入的整個陣列都是一樣的數,則會有最壞的時間複雜度即o(n^2),有興趣的同學自己證明,這樣時間就容易超限,於是我們需要進行優化,下面先展示未優化的**,大約時間超限17%。

#include

#include

#include

#include

#include

using

namespace std;

int a[

100005];

int n;

int visited[

1000055];

void

set(

)int

main()

a[i]

=x; visited[x]=1

;}for(

int i=

0;i)return0;

}

下面提供優化**,當我們仔細研究時發現,我們其實可以去掉多餘的訪問,例如乙個數已經被訪問了k次,那麼就說明他後面的k個數一定都被訪問了,所以我們可以將訪問陣列visited改為記錄訪問次數的陣列。例如,當visited【x】=k時,正好輸入的數是x,則我們直接將x跳到x+k的位置再進行判斷是否被訪問。

這樣未優化**的最壞的情況時間複雜度直接變成了o(n)。

**:

#include

#include

#include

#include

#include

using

namespace std;

int a[

100005];

int n;

int visited[

1000055];

void

set(

)int

main()

a[i]

=x; visited[x]++;

}for

(int i=

0;i)return0;

}

藍橋杯 2023年第十屆真題 等差數列

時間限制 1sec 記憶體限制 128mb 題目描述 數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一 部分的數列,只記得其中 n 個整數。現在給出這 n 個整數,小明想知道包含這 n 個整數的最短的等差數列有 幾項?輸入輸入的第一行包含乙個整數 n。第二行包含n個整數a1,a2,a...

2019第十屆藍橋杯C C

這是我第一次參加藍橋杯比賽,比完後,有點低於預期,自己的發揮低於預期,賽事水準也低於預期。教室裡面很多同學的電腦出現問題,舉辦學校也沒有完善的應急方案,有一部分同學11點鐘才可以做題。提取碼 560f1.給20個球員擔任五個不同位置的得分,要你選五個球員組成一支球隊的最大得分。這道題要是全排列做的話...

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

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