倍增初學有感

2021-10-23 09:39:07 字數 1337 閱讀 5969

倍增是指當普通的線性列舉無法滿足時間與空間要求,我們可以利用任意整數都可以表達成2的次冪項的和這樣的特性,從而只去列舉2的整數次冪上的和作為代表,其他的用代表值拼出即可。

總的來說就是類似於二分的優化演算法。

1.樸素演算法從前往後依次找,時間為o(n)

2.二分:定義乙個s陣列為a陣列的字首和陣列,對k進行二分,如果不算處理時間那麼時間為o(log n),這個演算法雖然時間較小但是遇到k為1這樣的特殊資料,時間會比樸素演算法慢。

3.倍增:

(1).定義 p = 1(每次倍增的變數), k = 0(目標值), sum = 0(現k個數之和)。

(2).開始倍增,首先判斷若把k向後移動p位是否成立,若可以擇將k+=p,p增大2倍, sum+=s[k + p] - s[k]。若不可以則將p縮小2倍。最後重複操作直至p = 0;

樸素:

#include 

#include

using namespace std;

int n, a[

1005

], sum =

0, t, k;

int main()

for(int i =

1;i <= n; i++)}

printf

("%d"

, k)

;return0;

}

二分:

#include 

#include

using namespace std;

int n, a[

1005

], sum =

0, t, k, s[

1005];

int main()

int qi =

0, zhong = n, mid;

while

(qi <= zhong)

else

}printf

("%d"

, mid)

;return0;

}

倍增:

#include 

#include

using namespace std;

int n, a[

1005

], sum =

0, t, k, s[

1005];

int main()

int p =1;

while

(p !=0)

}else

}printf

("%d"

, k)

;return0;

}

初學Ruby On Rails有感

因為看到一些牛人的部落格裡都有了對ruby on rails的認可,感覺主流的思想開始向rails傾斜了,那麼自己也不得不趕緊跟上,想法弄到了一本 應用rails進行敏捷web開發 之所以選擇它是因為它有rails,有ruby語法的講解還有敏捷一詞.這麼多讓我感興趣的東西集合到一起,我認定這會是一本...

初學UniRx有感

很久沒有那種寫完 後的舒爽感了,直到這幾天遇到了unirx 我真的被這種簡潔,這種優雅給驚呆了。我還只初學了一些皮毛,天知道深入學習以後還有什麼驚喜等著我.簡單來說 對於unity指令碼,unirx可以解決update的臃腫和堆砌的成員變數過多的問題。可以用極少的 完成時間上的非同步邏輯,可以使用響...

Algorithm LCA(倍增演算法)

基本思想 參考 from lanshui yang deep i 表示 i節點的深度,fa i,j 表示 i 的 2 j 即2的j次方 倍祖先,那麼fa i 0 即為節點i 的父親,然後就有乙個遞推式子 fa i,j fa fa i,j 1 j 1 可以這樣理解 設tmp fa i,j 1 tmp2...