网易游戏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 plain copy
  1. int *p1 = new int[10];  
  2. int *p2 = new int[10]();  

5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0X12           小端模式:0X56           X86结构的计算机使用  小端    模式。

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。

6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:

int (*fun)(int *)

7、下面程序运行后的结果为:to test something

[cpp]  view plain copy
  1. char str[] = "glad to test something";  
  2.     char *p = str;  
  3.     p++;  
  4.     int *p1 = static_cast<int *>(p);  
  5.     p1++;  
  6.     p = static_cast<char *>(p1);  
  7.     printf("result is %s\n",p);  

8、在一冒险游戏里,你见到一个宝箱,身上有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。 
网易游戏2011.10.15校园招聘会笔试题_第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 plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. const int lmax=10000;  
  5. int c1[lmax+1],c2[lmax+1];  
  6.   
  7. int main(void)  
  8. {  
  9.     int m,n,i,j,k,a[110];  
  10.     //计算的方法还是模拟手动运算,一个括号一个括号的计算,从前往后  
  11.     while (cin>>m && m)  
  12.     {  
  13.         n=0;  
  14.         for(i = 0; i < m; i++)  
  15.         {  
  16.             scanf("%d",&a[i]);  
  17.             n += a[i];  
  18.         }  
  19.         n += 5;     //有可能无法表示的那个数比所有纸币面额的总和还要大  
  20.         for(i = 0; i <= n; i++)  
  21.         {  
  22.             c1[i] = 0;  
  23.             c2[i] = 0;  
  24.         }  
  25.         for(i = 0; i < 2*a[0]; i += a[0])        //母函数的表达式中第一个括号内的各项系数  
  26.             c1[i] = 1;  
  27.         //第一层循环是一共有 n 个小括号,而刚才已经算过一个了,所以是从2 到 n   
  28.         // i 就是代表的母函数中第几个大括号中的表达式  
  29.         for(i = 2; i <= m; i++)  
  30.         {  
  31.             for(j = 0; j <= n; j++)              //j 就是指的已经计算出的各项的系数  
  32.             {  
  33.                 for (k = 0; k < 2*a[i-1]; k += a[i-1])      //k 就是指将要计算的那个括号中的项//要是扩展为可以用多张相同的钱,但是钱的数量有限制,设同一种钱的数量是t,则(t+1)*a[i-1]  
  34.                 {   
  35.                     c2[j+k] += c1[j];        //合并同类项,他们的系数要加在一起,所以是加法  
  36.                 }  
  37.             }  
  38.             for(j = 0; j <= n; j++)    // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项  
  39.             {  
  40.                 c1[j] = c2[j];  
  41.                 c2[j] = 0;  
  42.             }  
  43.         }  
  44.         for(i = 1; i <= n; i++)  
  45.         {  
  46.             if(c1[i] == 0)  
  47.             {  
  48.                 cout<<i<<endl;      //找出第一个无法表示的纸币面额  
  49.                 break;  
  50.             }  
  51.         }  
  52.     }  
  53.     return 0;  
  54. }  

这个题目我认为可以用背包的思想解决,没有必要用到母函数。

至于是否正确,以后再验证

先对钱币从小到大排序,然后再插入一个元素,大小是所有元素之和再加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.“母函数的思想很简单 — 就是把离散数列和幂级数一 一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造. “

 

我们首先来看下这个多项式乘法:

网易游戏2011.10.15校园招聘会笔试题_第2张图片

母函数图(1)

由此可以看出:

1.x的系数是a1,a2,…an 的单个组合的全体。

2. x^2的系数是a1,a2,…a2的两个组合的全体。

………

n. x^n的系数是a1,a2,….an的n个组合的全体(只有1个)。

 

进一步得到:

网易游戏2011.10.15校园招聘会笔试题_第3张图片

母函数图(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校园招聘会笔试题)