1、已知两个数字为1~30之间的数字,甲知道两数之和,乙知道两数之积,甲问乙:“你知道是哪两个数吗?”乙说:“不知道”。乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”。于是,乙说:“那我知道了”,随后甲也说:“那我也知道了”,这两个数是什么?

  1. 答案:
  2. 允许两数重复的情况下
  3. 答案为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
  4. 不允许两数重复的情况下有两种答案
  5. 答案1: x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
  6. 答案2: x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
  7.  
  8. 解:
  9. 设这两个数为x,y.
  10. 甲知道两数之和 A=x+y;
  11. 乙知道两数之积 B=x*y;
  12.  
  13. 该题分两种情况
  14. 允许重复, 有( <= x <= y <= );
  15. 不允许重复,有( <= x < y <= );
  16.  
  17. 当不允许重复, 即( <= x < y <= );
  18.  
  19. )由题设条件:乙不知道答案
  20. <=> B=x*y 解不唯一
  21. => B=x*y 为非质数
  22.  
  23. 又∵ x y
  24. B k*k (其中kN)
  25.  
  26. 结论(推论1):
  27. B=x*y 非质数且 B k*k (其中kN)
  28. 即:B ∈(,,,,,,,...)
  29. 证明过程略
  30.  
  31. )由题设条件:甲不知道答案
  32. <=> A=x+y 解不唯一
  33. => A >= ;
  34.  
  35. 分两种情况
  36. A=,A=6x,y有双解
  37. A>= x,y有三重及三重以上解
  38.  
  39. 假设 A=x+y=
  40. 则有双解
  41. x1=,y1=;
  42. x2=,y2=
  43. 代入公式B=x*y:
  44. B1=x1*y1=*=; (不满足推论1,舍去)
  45. B2=x2*y2=*=;
  46. 得到唯一解x=,y= 即甲知道答案
  47. 与题设条件:“甲不知道答案”相矛盾
  48. 故假设不成立, A=x+y
  49.  
  50. 假设 A=x+y=
  51. 则有双解
  52. x1=,y1=;
  53. x2=,y2=
  54. 代入公式B=x*y:
  55. B1=x1*y1=*=; (不满足推论1,舍去)
  56. B2=x2*y2=*=;
  57. 得到唯一解x=,y=
  58. 即甲知道答案
  59. 与题设条件:“甲不知道答案”相矛盾
  60. 故假设不成立, A=x+y
  61.  
  62. A>=7
  63. x,y的解至少存在两种满足推论1的解
  64. B1=x1*y1=*(A-)
  65. B2=x2*y2=*(A-)
  66. 符合条件
  67.  
  68. 结论(推论2):A >=
  69.  
  70. )由题设条件:乙说“那我知道了”
  71. => 乙通过已知条件B=x*y及推论()()可以得出唯一解
  72. 即:
  73.  
  74. A=x+y, A >=
  75. B=x*y, B ∈(,,,,,,,,...)
  76. <= x < y <=
  77. x,y存在唯一解
  78.  
  79. B= 时:有两组解
  80. x1=, y1=
  81. x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
  82. 得到唯一解 x=, y=
  83.  
  84. B= 时:有两组解
  85. x1=, y1=
  86. x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
  87. 得到唯一解 x=, y=
  88.  
  89. B> 时:容易证明均为多重解
  90.  
  91. 结论:
  92. B=6时有唯一解 x=, y= B=8时有唯一解 x=, y=
  93.  
  94. )由题设条件:甲说“那我也知道了”
  95. => 甲通过已知条件A=x+y及推论()可以得出唯一解
  96.  
  97. 综上所述,原题所求有两组解:
  98. x1=, y1=
  99. x2=, y2=
  100.  
  101. x<=y时,有( <= x <= y <= );
  102. 同理可得唯一解 x=, y=

2、一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。
高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)
它给出了部分代码如下:

  1. #define N 25
  2. double D[N]
  3. ....
  4. void Preprocess()
  5. {
  6. //Write your code1;
  7. }
  8. double Distance(int i, int j)
  9. {
  10. //Write your code2;
  11. }
  1. const int N = ;
  2. int D[N];
  3.  
  4. int A1toX[N];
  5.  
  6. void Preprocess()
  7. {
  8. srand(time());
  9.  
  10. for (int i = ; i < N; ++i)
  11. {
  12. D[i] = (rand()/(RAND_MAX+1.0)) * N;
  13. }
  14.  
  15. A1toX[] = D[]; //from A1 to A2
  16. for (int i = ; i < N; ++i)
  17. {
  18. A1toX[i] = A1toX[i-] + D[i]; //distance from A1 to each point
  19. }
  20. A1toX[] = A1toX[N-] + D[]; // total length
  21. }
  22.  
  23. int distance(int i, int j)
  24. {
  25. int di = (i == ) ? : A1toX[i-];
  26. int dj = (j ==) ? : A1toX[j-];
  27. int dist = abs(di - dj);
  28. return dist > A1toX[]/ ? A1toX[] - dist : dist;
  29. }
  30.  
  31. int main(void)
  32. {
  33. Preprocess();
  34. for (int i = ; i <N; ++i)
  35. {
  36. cout<<D[i]<<" ";
  37. }
  38. cout<<endl;
  39. for (int i = ; i <= N; ++i)
  40. {
  41. cout<<"distance from A1 to A"<<i<<": "<<distance(, i)<<endl;
  42. }
  43. return ;
  44. }

3、 一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"abc   efg  hij"打印为"cba gfe jih"。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<stack>
  4. #include<string>
  5. using namespace std;
  6.  
  7. string reverse(string str)
  8. {
  9. stack<char> stk;
  10. int len = str.length();
  11. string ret = "";
  12.  
  13. for (int p = , q = ;p < len;)
  14. {
  15. if (str[p] == ' ')
  16. {
  17. ret.append(,' ');
  18. for (q = p; q < len && str[q] == ' '; q++)
  19. {}
  20. p = q;
  21. }
  22. else
  23. {
  24. for (q = p; q < len && str[q] != ' '; q++)
  25. {
  26. stk.push(str[q]);
  27. }
  28. while(!stk.empty())
  29. {
  30. ret.append(,stk.top());
  31. stk.pop();
  32. }
  33. p = q;
  34. }
  35. }
  36. return ret;
  37. }
  38. int main(void)
  39. {
  40. string s = "abc def ghi";
  41. cout<<reverse(s).c_str()<<endl;
  42. return ;
  43. }

4、将一个较大的钱,不超过1000000(10^6)的人民币,兑换成数量不限的100、50、10、5、2、1的组合,请问共有多少种组合呢?(完全背包)(其它选择题考的是有关:操作系统、树、概率题、最大生成树有关的题。)。

第一种方法(母函数):

  1. #define NUM 7
  2. int money[NUM] = {, , , , , , };
  3.  
  4. // 母函数解法
  5. int NumOfCoins(int value)
  6. {
  7. int i , j , k , c1[] , c2[];
  8. for(i = ; i <= value ; ++i)
  9. {
  10. c1[i] = ;
  11. c2[i] = ;
  12. }
  13. //第一层循环是一共有 n 个小括号,而刚才已经算过一个了
  14. // i 就是代表的母函数中第几个大括号中的表达式
  15. for(i = ; i < NUM ; ++i)
  16. {
  17. for(j = ; j <= value ; ++j) //j 就是指的已经计算出的各项的系数
  18. {
  19. for(k = ; k+j <= value ; k += money[i]) //k 就是指将要计算的那个括号中的项
  20. c2[k+j] += c1[j];
  21. }
  22. for(j = ; j <= value ; ++j) // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项
  23. {
  24. c1[j] = c2[j];
  25. c2[j] = ;
  26. }
  27. }
  28. return c1[value];
  29. }

第二种方法(动态规划):
我们可以将它形式化为:

硬搜的话肯定是可以出结果的,但时间复杂度太高。
第一种方法:
设 F[n] 为用那么多种面值组成 n 的方法个数。则 F[n] 可以分成这样互不重复的几个部分:
只用 50 及以下的面值构成 [n] + 0 张 100
只用 50 及以下的面值构成 [n-100] + 1 张 100
只用 50 及以下的面值构成 [n-200] + 2 张 100
……
也就是说,按 F[n] 的组成方案中 100 的张数,将 F[n] 划分成若干等价类,等价类的划分要不重复、不遗漏。这些等价类恰好完整覆盖了 F[n] 的所有情况。
然后对于 50 及以下的方案又可以按 50 的张数划分等价类。于是像这样一层一层递归下去……就可以得到结果了。
把上面的递归过程反过来,从下往上递推,这就是动态规划了。代码(用到了一些 C99 特性,比如栈上的可变长数组):
时间复杂度 < O(N^2)

  1. #define NUM 7
  2. int money[NUM] = {, , , , , , };
  3. // 动态规划解法
  4. int NumOfCoins(int value)
  5. {
  6. int i , j , t , dp[][];
  7. for(i = ; i <= value ; ++i)
  8. dp[][i] = ;
  9.  
  10. for(i = ; i < NUM ; ++i)
  11. {
  12. for(j = ; j <= value ; ++j)
  13. {
  14. t = j;
  15. dp[i][j] = ;
  16. while(t >= )
  17. {
  18. dp[i][j] += dp[i-][t];
  19. t -= money[i];
  20. }
  21. }
  22. }
  23. return dp[][value];
  24. }

其中 dp[i][j] 表示只用第 i 张面值及以下构成 j 用多少种方法。
改进如下:
a[6][n] = ar[6][n-100]     // 至少包含 1 张 100 的拆分个数
              + ar[5][n]         // 不包含 100 的拆分个数
直接把时间复杂度从 O(n^2) 降到了 O(n):

  1. #define NUM 7
  2. int money[NUM] = {, , , , , , };
  3. // 动态规划解法(完全背包)
  4. int NumOfCoins(int value)
  5. {
  6. int i , j , dp[][];
  7. for(i = ; i <= value ; ++i)
  8. dp[][i] = ;
  9.  
  10. for(i = ; i < NUM ; ++i)
  11. {
  12. for(j = ; j <= value ; ++j)
  13. {
  14. if(j >= money[i])
  15. dp[i][j] = dp[i][j - money[i]] + dp[i - ][j];
  16. else
  17. dp[i][j] = dp[i-][j];
  18. }
  19. }
  20. return dp[][value];
  21. }

或者使用滚动数组也是可以的

  1. #define NUM 7
  2. int money[NUM] = {, , , , , , };
  3. int f[] , bf[];
  4. // f[j] == f[i][j] bf[j] == bf[i-1][j]
  5. int NumofCoin2(int value)
  6. {
  7. int i , j;
  8. for(j = ; j <= value ; ++j)
  9. f[j] = , bf[j] = ;
  10. bf[] = ;
  11.  
  12. for(i = ; i < NUM ; ++i)
  13. {
  14. for(j = ; j <= value ; ++j)
  15. {
  16. if(j >= money[i])
  17. f[j] = f[j-money[i]] + bf[j];
  18. else
  19. f[j] = bf[j] ;
  20. }
  21.  
  22. for(j = ; j <= value ; ++j)
  23. bf[j] = f[j] , f[j] = ;
  24. }
  25. return bf[value];
  26.  
  27. }

2012Google校园招聘笔试题的更多相关文章

  1. 2014 WAP校园招聘笔试题

    2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...

  2. google2013校园招聘笔试题(全国)

    google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...

  3. Microsoft 2013校园招聘笔试题及解答

    Microsoft 2013校园招聘笔试题及解答 题目是自己做的,求讨论.吐槽.拍砖 1.      Which of the following callingconvension(s) suppo ...

  4. Microsoft2013校园招聘笔试题

    Microsoft2013校园招聘笔试题 继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently ...

  5. C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]

    MS Recognition 在线提交: hihoCoder 1402 http://hihocoder.com/problemset/problem/1402 类似: OpenJudge - I:P ...

  6. 京东2017校园招聘笔试题 【第K个幸运数】

    题目描述 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字. 前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第 ...

  7. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  8. PPS2013校园招聘笔试题

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/11473405 一.简答题 (1)一位老师有2个推理能力很强的学生,他告诉 ...

  9. Microsoft2013校园招聘笔试题及解答

    继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently store the book orders ...

随机推荐

  1. HLS

    2018-04-14 WMY-竹海 相约电子ee 首先要启动软件,界面如下所示: 以最简单的矩阵运算为例吧,来介绍一下HLS的使用. 对于HLS的输入为C++或C代码,当然systemC也可以,主要完 ...

  2. Datatable转实体 实体转换辅助类

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  3. PostgreSQL判断是否为空coalesce

    coalesce(expr1,expr2,expr3...) 直到找到一个非null值返回,右边的表达式则不参与运算:若所有为null,返回null. eg:判断json是否包含某属性,若无,则取默认 ...

  4. 通过ip查找能应机器的MAC

    例如:10.100.0.61 这些都是基于linux系统: 首先:ping 一下这个ip 然后arp 10.100.0.61就可以找出主机的MAC地址

  5. Gradle-修改.gradle默认目录

    在Windows的环境变量中新建一个环境变量设置,GRADLE_USER_HOME,值为D:\Users\shaowei\.gradle,设置完成之后,点击确定,关闭设置窗口.这个时候可以去AS中看下 ...

  6. lua笔记二 赋值语句

    赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" t.n = t.n + 1 Lua可以对多个变量同时赋值,变量列 ...

  7. TF-IDF理解及其Java实现

    TF-IDF 前言 前段时间,又具体看了自己以前整理的TF-IDF,这里把它发布在博客上,知识就是需要不断的重复的,否则就感觉生疏了. TF-IDF理解 TF-IDF(term frequency–i ...

  8. javascript基础拾遗(三)

    1.map数组映射操作 function add(x) { return x+1 } var nums = [1,3,5,7,9] result = nums.map(add) console.log ...

  9. 【Socket】linux套接字技术之tcp

      1.mystery引入      1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信.    2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神.    3)当前流 ...

  10. Java获取此次请求URL以及服务器根路径的方法

    http://www.jb51.net/article/71693.htm ********************************************** 本文介绍了Java获取此次请求 ...