面試演算法智力題

2021-09-27 03:03:08 字數 3509 閱讀 4386

這個題是對bit位的應用,1000接近1024,所以需要10個bit位,對瓶子進行編號,從0到999,這樣需要10只老鼠。瓶子的編號分別為:

老鼠用  a ,b ,c ,d ,e ,f ,g ,h ,i , j ,表示

第0號瓶:00000,00000

第1號瓶:00000,00001      a

第2號瓶:00000,00010      b

第3號瓶:00000,00011       a   b

第4號瓶:00000,00101     a        c

第5號瓶:00000,00111     a   b   c

。。。。。。

第999號瓶:11111,00111   a    b   c        f g  h  i  j

同時給老鼠編號,從1,2,...10,從低位開始,讓第n個老鼠喝下第n個bit位為1瓶子中的藥水。24小時後,若所有的老鼠都沒有發病,那麼是第乙個瓶子有毒,如果有一些老鼠發病,那麼共同喝的那瓶毒藥的二進位製做與運算,得到的就是共同喝的那瓶,最低位+1(碼農一般從0開始),變成整數後,對應的數字即為有毒藥水的編號。

例如 第6號瓶有毒,那麼b d鼠 會死,與運算得到4+2=6號瓶有毒,6+1=7,第7瓶是毒藥。

它們最後都是通過數論或者自然數性質完美解決:

bash game       ➡同餘理論

wythoff game   ➡**分割

一堆n個物品,兩人輪流取,每次取1至m個,最後取完者勝。比如10個物品,每次只能取1到5個。

對於先手方:

1.面對[1...m]個局面,必勝

2.面對m+1個局面,必輸

3.如果可以使對手面臨必輸局面,那麼是必贏局面

基礎:1,2,...,m是必贏局面,m+1是必輸局面

遞推:m+2,m+3,...,2m+1是必贏局面,2m+2是必輸局面

...k(m+1)是必輸局面,應該允許k=0,因為0顯然也是必輸局面    

在必輸局和必贏局中,贏的一方的策略是: 拿掉部分物品,使對方面臨k(m+1)的局面 

例如上例中10個物品,只能拿1到5個,先手方拿4個即可,對手無論拿多少個,你下次總能拿完

從另乙個角度思考這個問題,如果物品數量隨機,那麼先手一方勝利的概率是m/(m+1),後手方勝利的概率是1/(m+1)

兩堆(ak,bk)(ak<=bk)個物品,兩人輪流取,遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子

1.面對(0,0)局面必輸

2.面對(1,1)(2,2)...(n,n)局面必贏,(0,1)(0,2)...(0,n)局面必贏

3.如果可以使對手面臨必輸局面,那麼是必贏局面

基礎:(0,0)是必輸局面;(0,1)(0 ,2)...(0,n)是必贏局面,

遞推:(1,2)是必輸局面;(1,1)是必贏局面

(1,3)(1 ,4)...(1,n)是必贏局面

(2,2),(2,3)...(2,n)是必贏局面

(3,5)是必輸局面;(3,3)(3,4)是必贏局面

(3,6)(3,7)...(3,n)是必贏局面

(5,5)(5,6)...(5,n)是必贏局面

(4,7)是必輸局面;(4,4)(4,5)(4,6)是必贏局面

(4,8)(4,8)(4,9)...(4,n)是必贏局面

(7,7)(7,8)(7,9)...(7,n)是必贏局面

(6,10)是必輸局面;(6,6)(6,7)(6,8)(6,9)是必贏局面

(6,11)(6,12)(6,13)...(6,n)是必贏局面

(10,10)(10,11)(10,12)...(10,n)是必贏局面

首先發現規律:(必輸局面的規律比較容易找到)

ak是前面必輸局未出現的數中最小者,

bk=ak+k( k=0,1,2,3,...n)

下面介紹必輸局(奇異局)的最重要性質:

1,2,...,n中每乙個自然數,出現且只出現在乙個奇異局中。

給定任意局勢(a,b),判定(a,b)是否為必輸局的方法是:

k=0,1...n 記**比例是φ=1.618033

ak=[k*φ],bk=ak+k=[k*φ*φ]

如k=0,ak=0,bk=0

k=1,ak=1,bk=2

k=2,ak=3,bk=5 

k=3,ak=4,bk=7

從勝負概率角度,如果堆中數量隨機,先手一方優勢很大

n只螞蟻以每秒1cm的速度在長為lcm的竹竿上爬行。當螞蟻看到竿子的端點時就會落下來。由於竿子太細,兩隻螞蟻相遇時,它們不能交錯通過,只能各自反方向爬行。對於每只螞蟻,我們只知道它離竿子最左端的距離為xi,但不知道它當前的朝向。請計算所有螞蟻落下竿子的最短時間和最長時間。

樣例:輸入

l=10

n=3x=

輸出min=4

max=8

c++實現

#include #include const int l = 10;

const int n = 3;

const int x[n] = ;

int main() 

cout《某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?」答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。

輸入描述: 

輸入檔案最多包含10組測試資料,每個資料佔一行,僅包含乙個正整數n(1<=n<=100),表示小張手上的空汽水瓶數。n=0表示輸入結束,你的程式不應當處理這一行。

輸出描述: 

對於每組測試資料,輸出一行,表示最多可以喝的汽水瓶數。如果一瓶也喝不到,輸出0。

輸入例子: 

3 10 

81 0

輸出例子: 

1 5 

40#includeusing namespace std;

static int drink=0; //全域性變數

int max(int own)

if(own==2)

if(own>2)

return 0;

}int main()

直通BAT面試演算法 智力題2 賽馬

作為乙個馬場的主人,你要安排你的n匹賽馬和另乙個馬場的n匹馬比賽。你已經知道了對方馬場的出戰表,即參加每一場的馬的強壯程度。當然你也知道你自己的所有馬的強壯程度。我們假定比賽的結果直接由馬的強壯程度決定,即更壯的馬獲勝 若相同則雙方均不算獲勝 請你設計乙個策略,使你能獲得盡量多的場次的勝利。給定對方...

面試智力題

最近蒐集了一些面試的智力題,特來分享一下,改變下思維方式 1 燒一根不均勻的繩子,從頭燒到尾總共需要1個小時,問如何用燒繩子的方法來確定半小時的時間呢?2 10個海盜搶到了100顆寶石,每一顆都一樣大小且價值連城。他們決定這麼分 1 抽籤決定自己的號碼 1 10 2 首先,由1號提出分配方案,然後大...

面試智力題

題目一 你的面前有30個硬幣,其中有10個正面朝上,20個反面朝上,混亂在一團。要求 現在用厚布遮住你的眼睛。要你把30個硬幣分成2團,每團正面朝上的硬幣個數相等。問 你要怎麼分?不能用手去觸控感覺,也沒有其他人幫忙。題目二 我們用4位二進位制數表示硬幣的狀態。由於最終的結果只要4枚硬幣狀態一樣就行...