對不起,第二個參考**順序顛倒了,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...