网易游戏2011.10.15校园招聘会笔试题
http://blog.csdn.net/hackbuteer1/article/details/6878570
1、對于一個內存地址是32位、內存頁是8KB的系統。0X0005F123這個地址的頁號與頁內偏移分別是多少。
頁面大小是8KB,那么頁內偏移量是從0x0000(0)~ 0x1FFF(2的13次方 - 1)。0x5F123/8K=2E,余數是1123;則頁號是47頁,頁內偏移量應該是0X00001123。
2、如果X大于0并小于65536,用移位法計算X乘以255的值為:????(X<<8)-X
X<<8-X是不對的,因為移位運算符的優先級沒有減號的優先級高,首先計算8-X為0,X左移0位還是8。
3、一個包含n個節點的四叉樹,每個節點都有四個指向孩子節點的指針,這4n個指針中有???3n+1?? 個空指針。
4、以下兩個語句的區別是:第一個動態申請的空間里面的值是隨機值,第二個進行了初始化,里面的值為0
[cpp]?view plaincopy5、計算機在內存中存儲數據時使用了大、小端模式,請分別寫出A=0X123456在不同情況下的首字節是,大端模式:0X12????????? ?小端模式:0X56?????????? X86結構的計算機使用??小端??? 模式。
一般來說,大部分用戶的操作系統(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
6、在游戲設計中,經常會根據不同的游戲狀態調用不同的函數,我們可以通過函數指針來實現這一功能,請聲明一個參數為int *,返回值為int的函數指針:
int (*fun)(int *)
7、下面程序運行后的結果為:to test something
[cpp]?view plaincopy8、在一冒險游戲里,你見到一個寶箱,身上有N把鑰匙,其中一把可以打開寶箱,假如沒有任何提示,隨機嘗試,問:
(1)恰好第K次(1=<K<=N)打開寶箱的概率是多少。??(1-1/n)*(1-1/(n-1))*(1-1/(n-2))***(1/(n-k+1)) = 1/n
(2)平均需要嘗試多少次。
?這個就是求期望值?? 由于每次打開寶箱的概率都是1/n,則期望值為:?? 1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2
9、頭文件中ifndef / define / endif 是做什么用的?
10、代碼里有時可以看到extern “C”,這語句是做什么用的?
11、平均要取多少個(0,1)中的隨機數才能讓和超過1。?
12、在下列乘法算式中,每個字母代表0~9的一個數字,而且不同的字母代表不同的數字:
?ABCDEFGH
*?????????????? ??AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
請寫出推導的過程。
本題唯一解為:A=2、B=4、C=6、D=9、E=1、F=3、G=5、H=8、J=7、K=0
13、輸入格式:第一行輸入N(N<=100)表示流通的紙幣面額數量;第二行N個紙幣的具體表示的面額,從小到大排列,取值【1,10^6】。
輸出格式:輸出一個整數,表示應該發行的紙幣面額,這個整數是已經發行的所有紙幣面額都無法表示的最小整數。(已經發行的每個紙幣面額最多只能使用一次)
| 輸入 | 輸出 |
| 5 1 2 3 9 100 | 7 |
| 5 1 2 4 9 100 | 8 |
| 5 1 2 4 7 100 | 15 |
思路:這是一個典型的母函數問題,一般的典型母函數如 G(x)= ?(1+x+x^2+x^3+x^4+x^5+....)*(1+x^2+x^4+x^6+x^8+x^10+....)*(1+x^3+x^6+x^9+x^12....).....
這個題目中的每個紙幣只能夠使用0次或1次,在上面的那個一般的母函數的基礎上修改一下就行了,就很簡單了。。
具體代碼如下:
[cpp]?view plaincopy這個題目我認為可以用背包的思想解決,沒有必要用到母函數。
至于是否正確,以后再驗證
先對錢幣從小到大排序,然后再插入一個元素,大小是所有元素之和再加1.
for i =1 ; i<n; ++i
? ? for (int v = money[i+1]-1; ?v> = money[i]; --v)
? ? ? ? ? ?if !dp[v]
? ? ? ? ? ? ? ?if dp[v-money[ i]]
? ? ? ? ? ? ? ? ? ?dp[v] = true
? ? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? ? ? 可能有結果?
關于母函數的闡述http://www.wutianqi.com/?p=596
母函數(Generating function)詳解
—?Tanky Woo
在數學中,某個序列的母函數(Generating function,又稱生成函數)是一種形式冪級數,其每一項的系數可以提供關于這個序列的信息。使用母函數解決問題的方法稱為母函數方法。
母函數可分為很多種,包括普通母函數、指數母函數、L級數、貝爾級數和狄利克雷級數。對每個序列都可以寫出以上每個類型的一個母函數。構造母函數的目的一般是為了解決某個特定的問題,因此選用何種母函數視乎序列本身的特性和問題的類型。
?
這里先給出兩句話,不懂的可以等看完這篇文章再回過頭來看:
1.“把組合問題的加法法則和冪級數的乘冪對應起來”
2.“母函數的思想很簡單 — 就是把離散數列和冪級數一 一對應起來,把離散數列間的相互結合關系對應成為冪級數間的運算關系,最后由冪級數形式來確定離散數列的構造. “
?
我們首先來看下這個多項式乘法:
母函數圖(1)
由此可以看出:
1.x的系數是a1,a2,…an 的單個組合的全體。
2. x^2的系數是a1,a2,…a2的兩個組合的全體。
………
n. x^n的系數是a1,a2,….an的n個組合的全體(只有1個)。
?
進一步得到:
母函數圖(2)
?
母函數的定義
對于序列a0,a1,a2,…構造一函數:
母函數圖(3)
稱函數G(x)是序列a0,a1,a2,…的母函數。
?
這里先給出2個例子,等會再結合題目分析:
?
第一種:
有1克、2克、3克、4克的砝碼各一枚,能稱出哪幾種重量?每種重量各有幾種可能方案?
考慮用母函數來解決這個問題:
我們假設x表示砝碼,x的指數表示砝碼的重量,這樣:
1個1克的砝碼可以用函數1+1*x^1表示,
1個2克的砝碼可以用函數1+1*x^2表示,
1個3克的砝碼可以用函數1+1*x^3表示,
1個4克的砝碼可以用函數1+1*x^4表示,
上面這四個式子懂嗎?
我們拿1+x^2來說,前面已經說過,x表示砝碼,x的指數表示砝碼的重量!初始狀態時,這里就是一個質量為2的砝碼。
那么前面的1表示什么?按照上面的理解,1其實應該寫為:1*x^0,即1代表重量為2的砝碼數量為0個。
所以這里1+1*x^2 = 1*x^0 + 1*x^2,即表示2克的砝碼有兩種狀態,不取或取,不取則為1*x^0,取則為1*x^2
?
不知道大家理解沒,我們這里結合前面那句話:
“把組合問題的加法法則和冪級數的乘冪對應起來“
?
接著討論上面的1+x^2,這里x前面的系數有什么意義?
這里的系數表示狀態數(方案數)
1+x^2,也就是1*x^0 + 1*x^2,也就是上面說的不取2克砝碼,此時有1種狀態;或者取2克砝碼,此時也有1種狀態。(分析!)
?
所以,前面說的那句話的意義大家可以理解了吧?
幾種砝碼的組合可以稱重的情況,可以用以上幾個函數的乘積表示:
(1+x)(1+x^2)(1+x^3)(1+x^4)
=(1+x+x^2+x^4)(1+x^3+^4+x^7)
=1 + x + x^2 + 2*x^3 + 2*x^4 + 2*x^5 + 2*x^6 + 2*x^7 + x^8 + x^9 + x^10
從上面的函數知道:可稱出從1克到10克,系數便是方案數。(!!!經典!!!)
例如右端有2^x^5 項,即稱出5克的方案有2種:5=3+2=4+1;同樣,6=1+2+3=4+2;10=1+2+3+4。
故稱出6克的方案數有2種,稱出10克的方案數有1種 。
接著上面,接下來是第二種情況:
?
第二種:
求用1分、2分、3分的郵票貼出不同數值的方案數:
大家把這種情況和第一種比較有何區別?第一種每種是一個,而這里每種是無限的。
母函數圖(4)
?
以展開后的x^4為例,其系數為4,即4拆分成1、2、3之和的拆分方案數為4;
即 :4=1+1+1+1=1+1+2=1+3=2+2
?
這里再引出兩個概念"整數拆分"和"拆分數":
所謂整數拆分即把整數分解成若干整數的和(相當于把n個無區別的球放到n個無標志的盒子,盒子允許空,也允許放多于一個球)。
整數拆分成若干整數的和,辦法不一,不同拆分法的總數叫做拆分數。
?
?
現在以上面的第二種情況每種種類個數無限為例,給出模板:
?
#include <iostream> using namespace std; // Author: Tanky Woo // www.wutianqi.com const int _max = 10001; // c1是保存各項質量砝碼可以組合的數目 // c2是中間量,保存沒一次的情況 int c1[_max], c2[_max]; int main() { //int n,i,j,k;int nNum; // int i, j, k;while(cin >> nNum){for(i=0; i<=nNum; ++i) // ---- ①{c1[i] = 1;c2[i] = 0;}for(i=2; i<=nNum; ++i) // ----- ②{for(j=0; j<=nNum; ++j) // ----- ③for(k=0; k+j<=nNum; k+=i) // ---- ④{c2[j+k] += c1[j];}for(j=0; j<=nNum; ++j) // ---- ⑤{c1[j] = c2[j];c2[j] = 0;}}cout << c1[nNum] << endl;}return 0; }?
我們來解釋下上面標志的各個地方:(***********!!!重點!!!***********)
①? 、首先對c1初始化,由第一個表達式(1+x+x^2+..x^n)初始化,把質量從0到n的所有砝碼都初始化為1.
②? 、 i從2到n遍歷,這里i就是指第i個表達式,上面給出的第二種母函數關系式里,每一個括號括起來的就是一個表達式。
③、j 從0到n遍歷,這里j就是(前面i個表達式累乘的表達式)里第j個變量,(這里感謝一下seagg朋友給我指出的錯誤,大家可以看下留言處的討論)。如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的系數,i=2執行完之后變為
(1+x+x^2+x^3)(1+x^3),這時候j應該指示的是合并后的第一個括號的四個變量的系數。
④ 、 k表示的是第j個指數,所以k每次增i(因為第i個表達式的增量是i)。
⑤? 、把c2的值賦給c1,而把c2初始化為0,因為c2每次是從一個表達式中開始的。
?
咱們趕快趁熱打鐵,來幾道題目:
(相應題目解析均在相應的代碼里分析)
1.? 題目:http://acm.hdu.edu.cn/showproblem.php?pid=1028
代碼:http://www.wutianqi.com/?p=587
這題大家看看簡單不?把上面的模板理解了,這題就是小Case!
看看這題:
2.? 題目:http://acm.hdu.edu.cn/showproblem.php?pid=1398
代碼:http://www.wutianqi.com/?p=590
要說和前一題的區別,就只需要改2個地方。 在i遍歷表達式時(可以參考我的資料—《母函數詳解》),把i<=nNum改成了i*i<=nNum,其次在k遍歷指數時把k+=i變成了k+=i*i; Ok,說來說去還是套模板~~~
3.? 題目:http://acm.hdu.edu.cn/showproblem.php?pid=1085
代碼:http://www.wutianqi.com/?p=592
這題終于變化了一點,但是萬變不離其中。
大家好好分析下,結合代碼就會懂了。
4.? 題目:http://acm.hdu.edu.cn/showproblem.php?pid=1171
代碼:http://www.wutianqi.com/?p=594
還有一些題目,大家有時間自己做做:
HDOJ:1709,1028、1709、1085、1171、1398、2069、2152
(原創文章,歡迎各位轉載,但是請不要任意刪除文章中鏈接,請自覺尊重文章版權,違法必究,謝謝合作。Tanky Woo原創, www.WuTianQi.com)
附:
1.在維基百科里講到了普通母函數、指數母函數、L級數、貝爾級數和狄利克雷級數:
http://zh.wikipedia.org/zh-tw/%E6%AF%8D%E5%87%BD%E6%95%B0
2.Matrix67大牛那有篇文章:什么是生成函數:
http://www.matrix67.com/blog/archives/120
3.大家可以看看杭電的ACM課件的母函數那篇,我這里的圖片以及一些內容都引至那。
如果大家有問題或者資料里的內容有錯誤,可以留言給出,博客: http://www.wutianqi.com/
?
Tanky Woo原創文章,轉載請注明出處:http://www.wutianqi.com/?p=596。
總結
以上是生活随笔為你收集整理的网易游戏2011.10.15校园招聘会笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程之美——4.11 扫雷游戏的概率
- 下一篇: 几何分布和超几何分布