当前位置:   article > 正文

微软2016校园招聘9月在线笔试题解

微软2016校园招聘9月在线笔试题解

微软2016校园招聘9月在线笔试题解

题目网址列表:http://hihocoder.com/contest/mstest2015sept2/problems

题目一分析:

问题描述:在二维坐标系中,给定一个圆的圆心坐标x,y,半径r,这个三个数是浮点数,在圆内或者圆边上找一个整数点(x,y坐标都是整数的点)使该点到圆心的距离最大,如果有多个这样的点,选择x坐标最大的点,如果还有多个点存在,则选择y坐标最大的点。

解体思路:通过枚举x,求y的最大值或者最小值。在程序中需要注意y值最大最小值的求法,可以调用cmath包中的函数 floor 和ceil函数,可以看下图进行理解,其中add_y就是程序中的变量。


  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <list>
  9. #include <queue>
  10. #include <cmath>
  11. #define eps 1e-7
  12. using namespace std;
  13. double x,y,r,MaxDis,res_x,res_y;
  14. //计算两点之间的距离
  15. double cal_dis(int x1,int y1)
  16. {
  17. return sqrt((x-x1)*(x-x1) + (y-y1) * (y-y1));
  18. }
  19. //判断新的坐标是否更新已有的坐标
  20. void judge(int x1,int y1)
  21. {
  22. double dis = cal_dis(x1,y1);
  23. if(dis > MaxDis + eps)
  24. {
  25. MaxDis = dis;
  26. res_x = x1;
  27. res_y = y1;
  28. }
  29. else if(abs(dis - MaxDis) < eps)
  30. {
  31. if(x1 > res_x)
  32. {
  33. res_x = x1;
  34. res_y = y1;
  35. }
  36. else if(x1 == res_x && y1 > res_y)
  37. {
  38. res_y = y1;
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. int cur_x,cur_y;
  45. while(cin >> x >> y >> r)
  46. {
  47. MaxDis = 0;
  48. // 枚举x坐标
  49. for(int i = -(r + 3);i<=r + 2;i++)
  50. {
  51. // 得到当前x的坐标
  52. cur_x = int(x) + i;
  53. //判断x坐标是否超出圆外
  54. if(abs(cur_x - x) >= r + eps)
  55. continue;
  56. double add_y = sqrt(r * r - (cur_x - x) * (cur_x - x));
  57. //获得最大的y轴坐标
  58. cur_y = floor(y + add_y);
  59. judge(cur_x,cur_y);
  60. //cout << cur_x << " ==== " << cur_y << endl;
  61. //获得最小的y轴坐标
  62. cur_y = ceil(y - add_y);
  63. judge(cur_x,cur_y);
  64. //cout << cur_x << " ==== " << cur_y << endl;
  65. }
  66. cout << res_x << " " << res_y << endl;
  67. }
  68. return 0;
  69. }
</pre><pre name="code" class="cpp">
题目二分析:
题目描述:n个城市,每条道路连接两个城市,n-1条道路正好把n个城市连接成一颗树,求解下面sum的值:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlIAAABCCAYAAACcljjBAAAXbElEQVR4Ae2d3etl0x/Hz/xyiwZXkyTjgpDSeEgoipELERkPJVem4YrkYZDkocYFpTDkwgWGuDQey5RBjIe4kBsjCVckzR/w/fXav9/7+Jz1XWs/nbPPnHPmvep8997r4bM+67U+a63PXufs/d2wtra2NnIwARMwARMwARMwARPoTOA/nUu4gAmYgAmYgAmYgAmYQEXAjpQNwQRMwARMwARMwAR6ErAj1ROci5mACZiACZiACZiAHSnbgAmYgAmYgAmYgAn0JGBHqic4FzMBEzABEzABEzABO1K2ARMwARMwARMwARPoScCOVE9wLmYCJmACJmACJmACdqRsAyZgAiZgAiZgAibQk4AdqZ7gXMwETMAETMAETMAE7EjZBkzABEzABEzABEygJwE7Uj3BuZgJmIAJmIAJmIAJ2JGyDZiACZiACZiACZhATwJ2pHqCczETMAETMAETMAETsCNlGzABEzABEzABEzCBngTsSPUE52ImYAImYAImYAImYEfKNmACJmACJmACJmACPQnYkeoJzsVMwARMwARMwARMwI6UbcAETMAETMAETMAEehKwI9UTnIuZgAmYgAmYgAmYgB0p24AJmIAJmIAJmIAJ9CRgR6onuEUo9tdff42eeuqp0bnnnrsI6lgHEzABEzABEzjiCBx1xLV4RRr8xhtvjF555ZXRgQMHRuedd96KtMrNMAETMAETMIHlIuAdqeXqr7G2//zzz+j9998f3X///eM4n5iACZiACZiACcyXgB2p+fKeWW3bt2+fmSwLMgETMAETMAET6EfAjlQ/bi5lAiZgAiZgAiZgAiM7UjaCWgL8oP3TTz8d59E1x0UL33///ejnn38eq8U1H4d2BGC3YcOG0R133LGuwJVXXlmlrUvoECEZsY86FF+prLA49dRTB28TrHkgpS4wvnN9HsvINppkxTLxnDqwrUXre35rmgvEl/SlDfRfUyiNpaZySqd8ST/lGfJYZ6PYyzzst0v7NL802XIXma3zrjksNYFdu3atbd26tdiGPXv2rI1Go9afKGvv3r1rW7ZsWdu4cePa7t2715Cl65ivWHnHhL66/vnnn2vbtm0b68Y1+qErbd+/f39HTY7M7AcPHqx45Vq/Y8eOqv9zaW3jkIG9OqxV9om9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" alt="" />
题目中有对边的权值进行改变后,再要求求解Sum,所以需要进行预处理,使对边权改变时,再次计算的时间复杂度比较低。
解题思路如下:统计每条边被上面的式子计算多少次。计算多少次,可以很容易从下图中看出来。图中绿色这条边把树分成两个子集,所以该边被计算的次数就是N(s1) * N(s2) ,其中N(s1) 表示s1集合点的个数 <span style="font-family: Arial, Helvetica, sans-serif;">N(s1) = 3 ,代码如下:</span>
<img src="data:image/png;base64,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" alt="" />
  1. <pre name="code" class="cpp">#include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <list>
  9. #include <queue>
  10. #include <cmath>
  11. using namespace std;
  12. typedef long long LL;
  13. #define MAXN 100005
  14. vector<int>next_vec[MAXN];
  15. vector<int>value_vec[MAXN];
  16. //记录每条边的长度,key是两个城市的id,id小的放前面
  17. map<pair<int,int>,int> edge_length_map;
  18. // 记录每条边在所有路径中使用的次数,key是两个城市的id,id小的放前面
  19. map<pair<int,int>,LL> num_map;
  20. int n,m;
  21. bool used[MAXN];
  22. //递归求解每条边被计算几次
  23. int dfs(int id)
  24. {
  25. used[id] = true;
  26. int acc = 1;
  27. int sub_num = 0;
  28. int sub_id;
  29. for(int i = 0;i< next_vec[id].size();i++)
  30. {
  31. sub_id = next_vec[id][i];
  32. //已经访问过不再访问
  33. if(used[sub_id] == true)
  34. continue;
  35. sub_num = dfs(sub_id);
  36. acc += sub_num;
  37. if(id < sub_id)
  38. num_map[make_pair(id,sub_id)] = (LL) sub_num * (n - sub_num);
  39. else
  40. num_map[make_pair(sub_id,id)] = (LL) sub_num * (n - sub_num);
  41. }
  42. return acc;
  43. }
  44. int main()
  45. {
  46. while(scanf("%d%d",&n,&m) == 2)
  47. {
  48. memset(used,0,sizeof(used));
  49. int u,v,k;
  50. for(int i = 0;i<n-1;i++)
  51. {
  52. scanf("%d%d%d",&u,&v,&k);
  53. if(u > v)
  54. swap(u,v);
  55. next_vec[u].push_back(v);
  56. next_vec[v].push_back(u);
  57. value_vec[u].push_back(k);
  58. value_vec[v].push_back(k);
  59. edge_length_map[make_pair(u,v)] = k;
  60. }
  61. dfs(1);
  62. LL sum = 0;
  63. map<pair<int,int>,int>::iterator ite = edge_length_map.begin();
  64. for(;ite!=edge_length_map.end();ite++)
  65. {
  66. sum += num_map[ite->first] * ite->second;
  67. }
  68. char command[10];
  69. for(int i = 0;i<m;i++)
  70. {
  71. scanf("%s",command);
  72. if(command[0] == 'Q')
  73. {
  74. cout << sum << endl;
  75. }
  76. else
  77. {
  78. scanf("%d%d%d",&u,&v,&k);
  79. if(u > v)
  80. swap(u,v);
  81. sum += (LL)(k - edge_length_map[make_pair(u,v)]) * (num_map[make_pair(u,v)]);
  82. edge_length_map[make_pair(u,v)] = k;
  83. }
  84. }
  85. for(int i = 0;i<=n;i++)
  86. {
  87. next_vec[i].clear();
  88. value_vec[i].clear();
  89. }
  90. edge_length_map.clear();
  91. num_map.clear();
  92. }
  93. return 0;
  94. }


 
题目三分析:
题目大意:给定一个序列,求该序列的子序列中有多少是<span style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.1;">Fibonacci数列的前缀。</span>

解题思路:很容易想到是动态规划,dp[i][j] 表示 序列的前i个数产生的子序列的数量(该子序列需要满足两个条件,1 是fibonacci数列的前缀 2子序列的最后一个数是fibonacci数列中的第j个)。理解状态的含义后,转移方程就比较好理解了,在此不详细说了,具体看程序。在实现中可以省略第一维,有点类似滚动数组。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <list>
  9. #include <queue>
  10. #include <cmath>
  11. using namespace std;
  12. typedef long long LL;
  13. #define MAXN 1000005
  14. #define mod 1000000007
  15. int a[MAXN],fib[30];
  16. LL dp[30];
  17. map<int,int> key_to_id;
  18. int main()
  19. {
  20. int n;
  21. scanf("%d",&n);
  22. for(int i = 1;i<=n;i++)
  23. scanf("%d",a+i);
  24. fib[0] =1;
  25. fib[1] = 1;
  26. int MaxNum = 2;
  27. int index = 2;
  28. while(MaxNum)
  29. {
  30. fib[MaxNum] = fib[MaxNum-1] + fib[MaxNum-2];
  31. key_to_id[fib[MaxNum]] = index++;
  32. if(fib[MaxNum] > 100005)
  33. break;
  34. MaxNum++;
  35. }
  36. memset(dp,0,sizeof(dp));
  37. LL sum = 0;
  38. int id;
  39. for(int i= 1;i<=n;i++)
  40. {
  41. if(a[i] == 1)
  42. {
  43. //当是1时,特殊处理
  44. sum = (sum + 1 + dp[0]) %mod;
  45. dp[1] += dp[0];
  46. dp[0] += 1;
  47. dp[1] %= mod;
  48. dp[0] %= mod;
  49. }
  50. else if(key_to_id.find(a[i]) != key_to_id.end())
  51. {
  52. // 是fibonacci 数列中的数时,进行如下处理
  53. id = key_to_id[a[i]];
  54. sum += dp[id -1];
  55. dp[id] += dp[id -1];
  56. dp[id] %= mod;
  57. sum %= mod;
  58. }
  59. // 如果不是fibonacci 数列中的数,不需要处理
  60. }
  61. cout << sum << endl;
  62. return 0;
  63. }


题目四分析:

题目大意:给定两个NXN的矩阵,对其中一个矩阵进行顺时针旋转操作(旋转操作有四种,90度,180度,270度,360度顺时针旋转),当N为偶数时,把矩阵分成相同大小的四块,再进行旋转操作,一直递归到N为奇数时,问第一个矩阵能否通过旋转与第二个矩阵完全相同。

解题思路:编写一个rotate函数实现矩阵90度旋转(其他都可以由它得到),第二个就是递归的实现,记得递归时的状态还原

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <string>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <list>
  9. #include <queue>
  10. #include <cmath>
  11. using namespace std;
  12. typedef long long LL;
  13. #define MAXN 105
  14. #define mod 1000000007
  15. int matri_a[MAXN][MAXN],matri_b[MAXN][MAXN];
  16. // 对二维数组中的某一正方形小块顺时针旋转90度
  17. void Rotate(int x1,int y1,int x2,int y2)
  18. {
  19. int len = x2 - x1 + 1;
  20. int **a = new int*[len];
  21. for(int i = 0 ;i< len;i++)
  22. a[i] = new int[len];
  23. for(int i = 0;i<len;i++)
  24. {
  25. for(int j = 0;j<len;j++)
  26. {
  27. a[j][len - 1 - i] = matri_a[x1 + i][y1 + j];
  28. }
  29. }
  30. for(int i = 0;i<len;i++)
  31. {
  32. for(int j = 0;j<len;j++)
  33. {
  34. matri_a[x1 + i][y1 + j] = a[i][j];
  35. }
  36. }
  37. delete a;
  38. }
  39. //判断两个矩阵对应小方块的元素是否都相等
  40. bool Is_same(int x1,int y1,int x2,int y2)
  41. {
  42. int len = x2 - x1 + 1;
  43. for(int i = 0;i<len;i++)
  44. {
  45. for(int j = 0;j<len;j++)
  46. {
  47. if(matri_a[x1 + i][y1 + j] != matri_b[x1 + i][y1 + j])
  48. return false;
  49. }
  50. }
  51. return true;
  52. }
  53. bool dfs(int x1,int y1,int x2,int y2)
  54. {
  55. int len = x2 - x1 + 1;
  56. int i = 0;
  57. bool ret = false;
  58. for(;i<4;i++)
  59. {
  60. Rotate(x1,y1,x2,y2);
  61. //直接旋转看能否与B矩阵保持一致,该方法是一种剪枝策略
  62. ret |= Is_same(x1,y1,x2,y2);
  63. // 如果直接旋转能保持一致,则不需要求解子问题,如果不加剪枝,可能会超时
  64. if(ret)
  65. break;
  66. if(len %2 == 0)
  67. {
  68. int tmp = len /2 -1;
  69. // 求解子问题,如果子问题都能解,则该问题也能解
  70. ret |= (dfs(x1,y1,x1 + tmp ,y1 + tmp) && dfs(x1 ,y1 + tmp + 1,x1 + tmp,y2) &&
  71. dfs(x1 + tmp + 1,y1,x2,y1 + tmp) && dfs(x1 + tmp +1 ,y1 + tmp +1,x2,y2));
  72. }
  73. if(ret)
  74. break;
  75. }
  76. // 状态还原,但是程序中不加如下几句代码也能够AC,是这个问题具有特殊性,不还原也是可以的,但是对于一般问题,还是按要求写比较好
  77. while(i++<3)
  78. {
  79. Rotate(x1,y1,x2,y2);
  80. }
  81. return ret;
  82. }
  83. int main()
  84. {
  85. int t,n;
  86. scanf("%d",&t);
  87. while(t--)
  88. {
  89. scanf("%d",&n);
  90. for(int i = 0 ;i<n;i++)
  91. for(int j = 0 ;j<n;j++)
  92. scanf("%d",matri_a[i] + j);
  93. for(int i = 0 ;i<n;i++)
  94. for(int j = 0 ;j<n;j++)
  95. scanf("%d",matri_b[i] + j);
  96. bool is_ok = dfs(0,0,n-1,n-1);
  97. if(is_ok)
  98. cout << "Yes" << endl;
  99. else
  100. cout << "No" << endl;
  101. }
  102. return 0;
  103. }



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号