微软2016校园招聘9月在线笔试题解
题目网址列表:http://hihocoder.com/contest/mstest2015sept2/problems
题目一分析:
问题描述:在二维坐标系中,给定一个圆的圆心坐标x,y,半径r,这个三个数是浮点数,在圆内或者圆边上找一个整数点(x,y坐标都是整数的点)使该点到圆心的距离最大,如果有多个这样的点,选择x坐标最大的点,如果还有多个点存在,则选择y坐标最大的点。
解体思路:通过枚举x,求y的最大值或者最小值。在程序中需要注意y值最大最小值的求法,可以调用cmath包中的函数 floor 和ceil函数,可以看下图进行理解,其中add_y就是程序中的变量。
#include
#include
#include
#include
#include
#include
#include
题目二分析:
题目描述:n个城市,每条道路连接两个城市,n-1条道路正好把n个城市连接成一颗树,求解下面sum的值:
题目中有对边的权值进行改变后,再要求求解Sum,所以需要进行预处理,使对边权改变时,再次计算的时间复杂度比较低。
解题思路如下:统计每条边被上面的式子计算多少次。计算多少次,可以很容易从下图中看出来。图中绿色这条边把树分成两个子集,所以该边被计算的次数就是N(s1) * N(s2) ,其中N(s1) 表示s1集合点的个数 N(s1) = 3 ,代码如下:
#include
#include
#include
#include
#include
#include
#include
题目三分析:
题目大意:给定一个序列,求该序列的子序列中有多少是Fibonacci数列的前缀。
解题思路:很容易想到是动态规划,dp[i][j] 表示 序列的前i个数产生的子序列的数量(该子序列需要满足两个条件,1 是fibonacci数列的前缀 2子序列的最后一个数是fibonacci数列中的第j个)。理解状态的含义后,转移方程就比较好理解了,在此不详细说了,具体看程序。在实现中可以省略第一维,有点类似滚动数组。
#include
#include
#include
#include
#include
#include
#include
题目四分析:
题目大意:给定两个NXN的矩阵,对其中一个矩阵进行顺时针旋转操作(旋转操作有四种,90度,180度,270度,360度顺时针旋转),当N为偶数时,把矩阵分成相同大小的四块,再进行旋转操作,一直递归到N为奇数时,问第一个矩阵能否通过旋转与第二个矩阵完全相同。
解题思路:编写一个rotate函数实现矩阵90度旋转(其他都可以由它得到),第二个就是递归的实现,记得递归时的状态还原
#include
#include
#include
#include
#include
#include
#include