倍增是指當普通的線性列舉無法滿足時間與空間要求,我們可以利用任意整數都可以表達成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...