careercup 數學與概率 7 7

2021-09-06 20:06:12 字數 1120 閱讀 3008

7.7 有些數的素因子只有3、5、7,請設計乙個演算法,找出其中第k個數。

解法:首先,我們可以將滿足條件的前幾個數列出來,以此尋找解題思路。

一種簡單的思路就是對於已經列出的數,我們依次去乘以3,5,7得到一組數 然後找出最小且還沒有列出的數,加入到這個列表。然後重複上面的步驟: 乘以3,5,7,找出最小且還沒有列出的數……這個方法的時間複雜度是o(n2 )。

這種思路存在乙個問題,就是重複計算。比如對於上面那個表,我想計算下乙個數, 那麼我用3,5,7去乘以表中的每乙個數,然後找出最小且沒有用過的數。 可是像3*3,3*5,3*7,5*5,5*7等等都是已經計算過且已經用了的, 按照上面的演算法就會不斷地重複計算。那我們有沒什麼辦法可以避免重複計算呢? 那就是將已經計算出來的數儲存好,並且保持它們有序。為了避免出現先用3乘以5, 然後又用5去乘以3的這種情況出現(這樣會使我們維護的數中出現重複), 我們可以用3個佇列來維護這些數。第1個佇列負責乘以3,第2個佇列負責乘以5, 第3個佇列負責乘以7。演算法描述如下:

1. 初始化結果res=1和佇列q3,q5,q7

2. 分別往q3,q5,q7插入1*3,1*5,1*7

3. 求出三個佇列的隊頭元素中最小的那個x,更新結果res=x

4. 如果x在:

q3中,那麼從q3中移除x,並向q3,q5,q7插入3*x,5*x,7*x

q5中,那麼從q5中移除x,並向q5,q7插入5*x,7*x

q7中,那麼從q7中移除x,並向q7插入7*x

5. 重複步驟3-5,直到找到第k個滿足條件的數

注意,當x出現在q5中,我們沒往q3中插入3*x,那是因為這個數在q5中已經插入過了。

c++實現**:

#include#include

using

namespace

std;

int get_num(int

k)

else

if(res==q5.front())

else

if(res==q7.front())

cnt++;

}return

res;

}int

main()

careercup 數學與概率

7.3 給定直角座標系上的兩條線,確定這兩條線會不會相交。解法 此題有很多不確定的地方 兩條線的格式是什麼?兩條線實為同一條怎麼處理?這些含糊不清的地方最好跟面試官討論一下。下面將做出以下假設 若兩條線是相同的 斜率和y軸截距相等 則認為這兩條線相交 兩條線若不平行則必相交。因此,要檢查兩條線相交與...

概率專題 概率 數學 基礎題

上週三講了概率和概率dp。如果沒有涉及其他綜合演算法,概率這種題主要是思維,先把這部分的東西寫完 如果shoot優選,則0之後更有可能0,狀態為,00,p1 00 00 01 如果rotate優選,則0之後再移一位更有可能為0,有 010,000,結果並不對,是因為題目還有一句話 you can r...

LightOJ1030 數學概率與期望

題意 有乙個直線的金礦,每個點有一定數量的金子 你從 開始,每次扔個骰子,扔出幾點就走幾步,然後把那個點的金子拿走 如果扔出的骰子超出了金礦,就重新扔,知道你站在最後乙個點 問拿走金子的期望值是多少 首先我們假設你現在站在第 個點,且從這個點開始走 那麼這個點的期望p i p i 1 6 p i 2...