亂搞 hihocoder1527 快速乘法

2021-08-14 15:56:45 字數 1164 閱讀 2231

在寫**時,我們經常要用到類似 x × a 這樣的語句( a 是常數)。眾所周知,計算機進行乘法運算是非常慢的,所以我們需要用一些加法、減法和左移的組合來實現乘乙個常數這個操作。具體來講, 我們要把 x × a替換成:(x

<)op1

(x<)op2

(x<)...

opn(

x<) 這樣的形式,其中op

i 是+或者-。

舉個例子:x×

15=(x

<<4)

−(x<<0)

。在本題中,假設左移(包括左移0)和加法、減法所需要的時間都是乙個單位的時間,上述的例子所需要的時間是3。

現在給定常數 a 的二進位制形式,求實現 x × a 最少需要多少單位的時間。

比較水的一道思維題:

假設我們從高到低地給每一位更改值,以得到目標狀態a

在第i位以後均為0的情況下,如果我們做以下操作: +x

<<(i

+1)−

x<可以將第i位到第j位都變為1,在第j+1位及以後又變回0

換一種思路看,我們有兩種操作:

1、用2的代價,將從當前位開始的每一位變為1,或用2的代價,將從當前位開始的每一位變為0。

2、用2的代價,將當前這一位強行修改。

很顯然,當且僅當ai

≠ai+

1且ai

≠ai−

1 (這裡的ai

表示二進位制下的第i位的值),我們會選擇2操作。

在其他情況下,(即有兩個及以上連續的位相同)我們必然會選擇1操作。

所以從前往後掃一遍即可,並且需要在數列的最後一位之後加上乙個0,以保證最後一定是以0結尾。

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 1000010

using

namespace

std;

char s[maxn];

int sum,len;

int main()

if(s[i]==now)

sum+=2;

}pf("%d",sum-1);

}

hihocode 1506 投擲硬幣

描述 小hi有一枚神奇的硬幣。已知第i次投擲這枚硬幣時,正面向上的概率是pi。現在小hi想知道如果總共投擲n次,其中恰好m次正面向上的概率是多少。輸入第一行包含兩個整數n和m。第二行包含n個實數p1,p2,pn。對於30 的資料,1 n 20 對於100 的資料,1 n 1000,0 m n,0 p...

hihocode 1979假期旅行

小hi有乙個連續m天的假期,他計畫在這m天內按順序遊玩n個城市,每個城市至少遊玩1天。已知小hi從乙個城市到另乙個城市不需要太多時間,即如果第i天是小hi在第j個城市的最後一天,那麼第i 1天就是小hi在第j 1個城市的第一天。通過天氣預報小hi知道這m天內每個城市是晴天還是雨天,他希望自己遊玩的每...

亂搞 正確姿勢的亂搞 模擬退火

模擬退火大概原理就是將熱力學裡面金屬退火的原理放在了統計學意義中。其在電腦科學中的應用也是很可觀的 處理一些無法用多項式時間複雜度解決的np問題。對於一些最優化問題,往往我們可以轉化為乙個神奇的函式 引數不限 比如像這樣 如果這個函式滿足單峰性,我們往往可以直接套用三分來處理,但是都說了這如果是乙個...