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

答案:
允许两数重复的情况下
答案为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
不允许两数重复的情况下有两种答案
答案1: 为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
答案2: 为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y= 解:
设这两个数为x,y.
甲知道两数之和 A=x+y;
乙知道两数之积 B=x*y; 该题分两种情况
允许重复, 有( <= x <= y <= );
不允许重复,有( <= x < y <= ); 当不允许重复, 即( <= x < y <= ); )由题设条件:乙不知道答案
<=> B=x*y 解不唯一
=> B=x*y 为非质数 又∵ x ≠ y
∴ B ≠ k*k (其中k∈N) 结论(推论1):
B=x*y 非质数且 B ≠ k*k (其中k∈N)
即:B ∈(,,,,,,,...)
证明过程略 )由题设条件:甲不知道答案
<=> A=x+y 解不唯一
=> A >= ; 分两种情况
A=,A=6时x,y有双解
A>= 时x,y有三重及三重以上解 假设 A=x+y=
则有双解
x1=,y1=;
x2=,y2=
代入公式B=x*y:
B1=x1*y1=*=; (不满足推论1,舍去)
B2=x2*y2=*=;
得到唯一解x=,y= 即甲知道答案
与题设条件:“甲不知道答案”相矛盾
故假设不成立, A=x+y≠ 假设 A=x+y=
则有双解
x1=,y1=;
x2=,y2=
代入公式B=x*y:
B1=x1*y1=*=; (不满足推论1,舍去)
B2=x2*y2=*=;
得到唯一解x=,y=
即甲知道答案
与题设条件:“甲不知道答案”相矛盾
故假设不成立, A=x+y≠ 当A>=7时
∵ x,y的解至少存在两种满足推论1的解
B1=x1*y1=*(A-)
B2=x2*y2=*(A-)
∴ 符合条件 结论(推论2):A >= )由题设条件:乙说“那我知道了”
=> 乙通过已知条件B=x*y及推论()()可以得出唯一解
即: A=x+y, A >=
B=x*y, B ∈(,,,,,,,,...)
<= x < y <=
x,y存在唯一解 当 B= 时:有两组解
x1=, y1=
x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
得到唯一解 x=, y= 当 B= 时:有两组解
x1=, y1=
x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
得到唯一解 x=, y= 当 B> 时:容易证明均为多重解 结论:
当B=6时有唯一解 x=, y= 当B=8时有唯一解 x=, y= )由题设条件:甲说“那我也知道了”
=> 甲通过已知条件A=x+y及推论()可以得出唯一解 综上所述,原题所求有两组解:
x1=, y1=
x2=, y2= 当x<=y时,有( <= x <= y <= );
同理可得唯一解 x=, y=

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

#define N 25
double D[N]
....
void Preprocess()
{
//Write your code1;
}
double Distance(int i, int j)
{
//Write your code2;
}
const int N = ;
int D[N]; int A1toX[N]; void Preprocess()
{
srand(time()); for (int i = ; i < N; ++i)
{
D[i] = (rand()/(RAND_MAX+1.0)) * N;
} A1toX[] = D[]; //from A1 to A2
for (int i = ; i < N; ++i)
{
A1toX[i] = A1toX[i-] + D[i]; //distance from A1 to each point
}
A1toX[] = A1toX[N-] + D[]; // total length
} int distance(int i, int j)
{
int di = (i == ) ? : A1toX[i-];
int dj = (j ==) ? : A1toX[j-];
int dist = abs(di - dj);
return dist > A1toX[]/ ? A1toX[] - dist : dist;
} int main(void)
{
Preprocess();
for (int i = ; i <N; ++i)
{
cout<<D[i]<<" ";
}
cout<<endl;
for (int i = ; i <= N; ++i)
{
cout<<"distance from A1 to A"<<i<<": "<<distance(, i)<<endl;
}
return ;
}

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

#include<iostream>
#include<cstdio>
#include<stack>
#include<string>
using namespace std; string reverse(string str)
{
stack<char> stk;
int len = str.length();
string ret = ""; for (int p = , q = ;p < len;)
{
if (str[p] == ' ')
{
ret.append(,' ');
for (q = p; q < len && str[q] == ' '; q++)
{}
p = q;
}
else
{
for (q = p; q < len && str[q] != ' '; q++)
{
stk.push(str[q]);
}
while(!stk.empty())
{
ret.append(,stk.top());
stk.pop();
}
p = q;
}
}
return ret;
}
int main(void)
{
string s = "abc def ghi";
cout<<reverse(s).c_str()<<endl;
return ;
}

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

第一种方法(母函数):

#define NUM 7
int money[NUM] = {, , , , , , }; // 母函数解法
int NumOfCoins(int value)
{
int i , j , k , c1[] , c2[];
for(i = ; i <= value ; ++i)
{
c1[i] = ;
c2[i] = ;
}
//第一层循环是一共有 n 个小括号,而刚才已经算过一个了
// i 就是代表的母函数中第几个大括号中的表达式
for(i = ; i < NUM ; ++i)
{
for(j = ; j <= value ; ++j) //j 就是指的已经计算出的各项的系数
{
for(k = ; k+j <= value ; k += money[i]) //k 就是指将要计算的那个括号中的项
c2[k+j] += c1[j];
}
for(j = ; j <= value ; ++j) // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项
{
c1[j] = c2[j];
c2[j] = ;
}
}
return c1[value];
}

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

硬搜的话肯定是可以出结果的,但时间复杂度太高。
第一种方法:
设 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)

#define NUM 7
int money[NUM] = {, , , , , , };
// 动态规划解法
int NumOfCoins(int value)
{
int i , j , t , dp[][];
for(i = ; i <= value ; ++i)
dp[][i] = ; for(i = ; i < NUM ; ++i)
{
for(j = ; j <= value ; ++j)
{
t = j;
dp[i][j] = ;
while(t >= )
{
dp[i][j] += dp[i-][t];
t -= money[i];
}
}
}
return dp[][value];
}

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

#define NUM 7
int money[NUM] = {, , , , , , };
// 动态规划解法(完全背包)
int NumOfCoins(int value)
{
int i , j , dp[][];
for(i = ; i <= value ; ++i)
dp[][i] = ; for(i = ; i < NUM ; ++i)
{
for(j = ; j <= value ; ++j)
{
if(j >= money[i])
dp[i][j] = dp[i][j - money[i]] + dp[i - ][j];
else
dp[i][j] = dp[i-][j];
}
}
return dp[][value];
}

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

#define NUM 7
int money[NUM] = {, , , , , , };
int f[] , bf[];
// f[j] == f[i][j] bf[j] == bf[i-1][j]
int NumofCoin2(int value)
{
int i , j;
for(j = ; j <= value ; ++j)
f[j] = , bf[j] = ;
bf[] = ; for(i = ; i < NUM ; ++i)
{
for(j = ; j <= value ; ++j)
{
if(j >= money[i])
f[j] = f[j-money[i]] + bf[j];
else
f[j] = bf[j] ;
} for(j = ; j <= value ; ++j)
bf[j] = f[j] , f[j] = ;
}
return bf[value]; }

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. 修改 Semantic UI 中对 Google 字体的引用

    在第一次尝试 Semantic UI 后,发现其 css 中第一行,就引用了 fonts.googleapis.com 中的字体. 不知道为什么要这么做,也许在国外,google 的服务已经是一种互联 ...

  2. 关于Suppressing notification from package com.xxx.xxx by user request.的异常

    其实以下都是废话. 如果你的测试的真机或者是模拟器是android4.1以上, 就有可能遇到这个Toast或者通知不能弹出. 自己不懂为什么. 想想你自己的应用设置是否有勾上这个 没有的话.就活该显示 ...

  3. ios开发-引导页实现

    源码:http://files.cnblogs.com/ios8/%5Bcode4app.com%5DIntroductionTutorialView_10843.zip 可以看看demo,很简单,我 ...

  4. Python:sitecustomize 和 usercustomize

    Python提供了两个hook用于定制Python:sitecustomize 和 usercustomize,首先需要查看site包目录, 然后就可以在此目录下创建usercustomize.py文 ...

  5. Spark(Hive) SQL中UDF的使用(Python)【转】

    相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...

  6. 【ARM】串行通信

    异步通信 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本是同步的.   异步串行通信的特点可以概括如下 1)以字符为单位传送信息 2)相邻两字符间的间隔是 ...

  7. Asp.Net采集网页方法大全(5种)

    /// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...

  8. 【自动化测试】selenium之 chromedriver与chrome版本映射表

    chromedriver版本 支持的Chrome版本 v2.30 v58-60 v2.29 v56-58 v2.28 v55-57 v2.27 v54-56 v2.26 v53-55 v2.25 v5 ...

  9. s3c2440内存控制器与SDRAM基本测试

    前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...

  10. poj2528(线段树+区间离散)

    题意:那个城市里要竞选市长,然后在一块墙上可以贴海报为自己拉票,每个人可以贴连续的一块区域,后来帖的可以覆盖前面的,问到最后一共可以看到多少张海报.思路:一看就知道是线段树,只是说要利用到离散化,也不 ...