今天看到的乙個位運算加速,是基於時鐘問題的

2021-06-18 00:06:11 字數 1335 閱讀 5322

對不起,第二個參考**順序顛倒了,8月24日以前的為舊版本,現已改正。

usaco和poj上都有一道這樣的題:

給你九個時鐘,每個時鐘只有四種狀態:12,3,6,9點

給你九種方法,每一種都有對應的幾個時鐘往後調三個小時

九種方案:

move

affected clocks

1abde

2abc

3bcef

4adg

5bdefh

6cfi

7degh

8ghi

9efhi

(從a開始,代表第幾個時鐘需要轉3 hour)

本來想用模擬暴搜,但是想想,肯定沒有那麼坑爹

於是,蒐羅到了這個辦法:

把四種狀態設為0,1,2,3

他們的二進位制就是:000,001,010,011

(ps:取三位是為了把9點這種情況的最高位1&掉)

這下,每選一次方案,瞬間狀態就表示為九個狀態的二進位制放在一起:

如010010010010010010010010010就是九個時鐘都為6點

而這麼長一串數字的十進位制為38347922, 在c++中屬於int範圍

最終題目的要求是把所有的時鐘都調至12點,也就是狀態為(000000000000000000000000000)2=(0)10

這樣只需要開乙個int變數f表示狀態,當f=0時,目標就達到了。

那麼選方案時怎麼操作呢?

直接十進位制下加1(進製)就可以了(你自己試試)

但是,9點是011,加1後變成100,所以要用整個狀態&57521883(011011011011011011011011011)

再把例子舉到位就是:

九種方案分別是:

move

affected clocks

14617(1001000001001)

273(1001001)

336936(

110110100100110110)4

262657(1000000001000000001)

52134536(1000001001001000001000)

616810048(1000000001000000001000000)

72363904(1001000001001000000000)

819136512(1001001000000000000000000)

918911232(1001000001001000000000000)

(首位的0全部省略)

這樣直接相加就算是選擇了一種方案了

o(∩_∩)o~

二進位制的妙趣以後還要多多發覺~~~~~~~~~~~~~~~~

位運算的乙個例子

原題 題解 狀壓樸素 也就是用二進位制代替布林陣列,然後樸素地給出 include using namespace std int main return 0 對while語句的解釋 運算順序 算術運算 移位運算 位運算 邏輯運算 p 10是p的個位數字,當每次進入while迴圈時,認為此時游標總是...

通過乙個位運算演算法,感覺該複習基礎知識了

題目 乙個整型數n,要把它的二進位制形式的第i位與j位調換?要求 用位運算 剛拿到手感覺,應該不會太難,但做到把這兩個位提取後,再想交換時,思路卡著了 最後看看論壇上別人的答案 不止乙個,但這個我比較滿意,下面這個演算法是csdn中使用者名為 zecard fu提供的 感覺眼前豁然一亮 code i...

通過乙個位運算演算法,感覺該複習基礎知識了

題目 乙個整型數n,要把它的二進位制形式的第i位與j位調換?要求 用位運算 剛拿到手感覺,應該不會太難,但做到把這兩個位提取後,再想交換時,思路卡著了 最後看看論壇上別人的答案 不止乙個,但這個我比較滿意,下面這個演算法是csdn中使用者名為 zecard fu提供的 感覺眼前豁然一亮 code i...