牛客基礎演算法訓練營2 斐波那契數列的變形考法

2021-10-19 10:33:49 字數 1686 閱讀 2856

在演算法競賽中"hack"一般指用一組測試資料觸發程式的缺陷,從而導致本來通過題目的ac**無法通過該測試資料。

一般情況見得比較多的是用hack資料導致別人wa掉,當然也有一些會導致原本的ac**tle和mle。

牛牛在一些簡單的練習題時遇到了這樣乙個問題。給定乙個大小為n的陣列a(1≤ai≤1e9),然後請你判斷陣列元素是否能夠從中選出三個組成乙個三角形。

牛牛發現ac通過的**中有這樣一種暴力邏輯,該邏輯的偽**如下。

for i = 1 ... n

for j = i + 1 ... n

for k = j + 1 ... n

if is********(a[i],a[j],a[k])

print("yes")

exit

end if

end for

end for

end for

print("no")

exit

其實就是三重迴圈列舉陣列的三個元素,檢查是否為三角形。這段**很取巧的地方在於它存在一種「短路」邏輯,一旦發現存在三角形就立刻終止程式。

這樣在隨機資料下其實很容易發現三角形,所以如果資料純隨機,顯然這就是一段ac**。

牛牛當然知道這個**很明顯就存在缺陷,如果資料構造的好的話應該可以卡tle,但是牛牛發現,他並不會構造出能夠hack這個暴力演算法的資料,所以他請你來幫他。

我們以這段程式呼叫is********的次數作為時間複雜度的計算依據,請你構造資料hack這段暴力程式,使它tle掉。

第一行輸入乙個正整數n(3≤n≤1053 \leq n \leq 10^53≤n≤105)表示需要你構造的陣列大小。
輸出n個正整數,正整數的範圍在[1,109][1,10^9][1,109]之間,要求該暴力程式在執行過程中呼叫is********函式的次數不得少於min(cn3,n2⌊log2n⌋)min(c_n^3,n^2\left \lfloor log_2n \right \rfloor)min(cn3​,n2⌊log2​n⌋)
示例1

3
2 2 2
當n=3時題目要求小w的程式呼叫is********函式的次數不得少於1次,所以輸出任意的3個正整數都能符合條件。
示例2

10
1 2 4 8 16 32 64 128 256 512
由於任何三個數字都無法組成三角形,所以會掃瞄到最後一組,達到最大複雜度,一共呼叫了120次is********函式。
構造

前用斐波那契數列填充,後全部用1填充即可。

#includeusing namespace std;

typedef long long ll;

#define n 100010

ll n,a[n];

int main()

; int n;

cin>>n;

if(n==1)cout<<0<

日後積累,看還有沒有更快更好的辦法。

牛客網 斐波那契數

題目 id 45846 fibonacci數列 6 rp 1 ru activity oj qru ta 2017test question ranking 題目解析 本題是對於fibonacci數列的乙個考察,fibonacci數列的性質是第一項和第二項都為1,後面的項形成遞迴 f n f n 1...

牛客寒假演算法基礎演算法訓練營2

1 座與重修費 題目描述 期末考試結束了,座發現很多人掛了大物,只能等著第二年重修,還要交400元的重修費。座突然想起有個學長和他講過,如果學校哪一年缺錢了,那一年的大物試卷就會特別難。現在 座有了所有人的成績,座想知道如果所有掛科的人都在第二年重修,學校能賺多少重修費?掛科是指一門課的分數小於60...

牛客 斐波那契數列

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 最後比較兩種方法雖然都是可以通過題目中的測試用例,但是使用遞迴方法的執行時間明顯比使用迭代方法的執行時間 原因 使用迭代的方法的時候重複計算,而且重複的情況還很嚴重,舉個例子,n 4,看看程...