Codility上的練習 (9)

2021-06-27 12:44:26 字數 2140 閱讀 6910

(1) countsemiprimes

半質數的定義是恰好兩個質數(可以相同)乘積的數,例如4, 6, 9, 10, 14, 15, 21, 22, 25, 26,都是半質數。給定n,長度為m的等長整數陣列p和q,滿足1 ≤ p[k] ≤ q[k] ≤ n, 求每個區間[p[k], q[k]]之間有多少個半質數。

函式頭部:vectorsolution(int n, vector&p, vector&q);

資料範圍: n[1..50000] 陣列長度m [1..30000]。

要求時間複雜度 o(nlogn + m), 空間複雜度o(n + m)。

分析: 我們可以用篩法篩出質數。 簡單篩質數篩法的複雜度為n / 2 + n /3 + n / 5 + .... + n / (不超過n的最大質數) 就是n除以質數的和,由於調和級數的漸近複雜度,知道篩法的時間複雜度是o(nlogn),空間複雜度為o(n)。 篩出質數後,我們同樣利用篩法的思想,對每個不超過sqrt(n)的質數,算出判斷它的每個倍數是不是半質數……當然這裡可以優化,可以用兩個質數乘積求出所有半質數。 這部分複雜度可以用o(nlogn)界定。 接下來,我們利用字首和思想,打出一張o(n)的表tab,表示0..i中有多少個半質數。這個時間複雜度是o(n),然後對於p[i], q[i]。我們直接用tab[q[i]] - tab[p[i] - 1]得到結果,m個pair的時間複雜度為o(m)。

**:

// you can also use includes, for example:

// #include vectorsolution(int n, vector&p, vector&q) }}

vectoris;

is.resize(n + 1, false);

for (int i = 2; n / i >= i; ++i) }}

}vectornum;

num.resize(n + 1);

num[0] = 0;

for (int i = 1; i <= n; ++i)

vectoranswer;

for (int i = 0; i < p.size(); ++i)

return answer;

}

(2) countnondivisible

給定乙個整數陣列,求每個元素在陣列中非約數的個數。

例如:a[0] = 3

a[1] = 1

a[2] = 2

a[3] = 3

a[4] = 6

a[0] = 3在陣列中的非約數有2,6

a[1] = 1在陣列中的非約數有3,2,3,6

a[2] = 2在陣列中的非約數有3,3,6

a[3] = 3在陣列中的非約數有2,6

a[4] = 6在陣列中的沒有非約數

因此返回陣列[2,4,3,2,6]。

函式頭部: vectorsolution(vector&a);

資料範圍: 陣列長度n [1..50000]

陣列元素範圍: [1..2 * n]

要求時間複雜度 o(nlogn) 空間複雜度o(n)

這題的關鍵在於資料範圍和陣列長度的數量級相同,都是o(n)。我們可以用2 * n的空間統計陣列a中每個數出現多少次。我們在用一張表tab[1..2 * n],tab[i]記錄陣列a中出現的i的非約數有幾個。起初我們認為tab[i] =  n,即a中所有的數都不是i的約數。然後對於每個a中出現的數,類似篩法,我們求它所有的倍數j,從tab[j]中減掉i在a中出現的次數,因為i是j的約數。時間複雜度主要在篩法那裡 是o(2nlog(2n)) = o(nlogn)。空間複雜度主要是兩張表,一張統計數在a出現多少次,一張是tab,因為資料範圍是2 * n,所以這個空間還是o(n)的。

**:

// you can also use includes, for example:

// #include vectorsolution(vector&a)

vectoranswer;

answer.resize(m + 1, n);

for (int i = 1; i <= m; ++i) }}

vectorr;

for (int i = 0; i < n; ++i)

return r;

}

Codility上的練習(11)

1 ladder 給定兩個等長的陣列a和b,a i 和b i 表示求乙個有a i 級的梯子,每次上1級或者兩級,上到最高端的方法數對2 b i 取餘數的結果。資料範圍 陣列長度 l 1.30000 a中數字範圍 1.l b中數字範圍 1.30 要求複雜度 時間空間都是o l 分析 打表法 我們迴圈可...

Codility上的練習 (14)

1 tieropes 給定n段繩子 乙個正整數陣列,和乙個正整數k,每次只能連線相鄰的兩根繩子,連線好了繩子長度為之前的繩子長度和,並且位置不變,問這麼連線下去,最多能形成多少根長度至少為k的繩子?資料範圍 n 1.10 5 陣列元素和k的範圍 1.10 9 要求複雜度 時間o n 空間o 1 分析...

Codility上的練習 (15

1 numbersolitaire 乙個遊戲是從一排n個格仔開始,格仔編號0.n 1,起初,棋子在a 0 每個格仔裡有乙個整數 可能正,可能負 你在格仔i,你扔骰子,得到點數x 1.6 然後走到編號為i x的格仔,如果這個格仔不存在就再投一次骰子,直到i x號格仔存在。你走到n 1號格仔時,遊戲結束...