Hackerearth: August Circuits 比赛记录

来源:互联网 发布:90年代中国电影 知乎 编辑:程序博客网 时间:2024/05/03 12:01
    Hackerearth上每个月会举办一次为期一周的比赛,此次是第一次参加比赛。赛题难度由易到难,各种类型的题目都有。在没有其它参考的情况解解决算法问题,算是对自己算法实现能力的一次检验。

赛题1:Dual issue

题目:由两个素数的的乘积构成的数乘积称为dual numbers。给定一个数组,求由这个数组能组成的最大的dual number。数组中的数可重复使用。

思路:找出最大的素数,输出其平方。

赛题2:Killing Assistants

题目:有n个学生在进行射击,学生分两种类型。普通学生每次设计有1/2的概率中靶,优秀学生每次射击有2/3的概率中靶。其中普通学生有m个。
现有一个学生进行了两次射击,一次射中,一次miss,求该生为普通学生的概率。

思路:直接依据概率论的公式进行计算即可。

赛题3:Detroying houses

题目:
在二维平面上分布有多所房子,房子的坐标由(xi,yi )给出。在以原点为圆心,半径为R的圆内均匀随机地放置一个炸弹。炸弹的杀伤半径为D,所有在杀伤范围内的房子都会被摧毁。求最后被摧毁的房子的数量的期望。

思路:等价于求圆(0,0)-R,与圆(xi,yi)-D的相交部分的面积。因为在圆(0,0)-R内,只要炸弹落在这个区域内,房子必定被摧毁。因此对每个房子而言,被摧毁的概率为相交部分的面积占圆(0,0)-R的面积的比例。原问题转化为求圆相交面积的问题。

赛题4:Game with Xor

有n个数字,Alice和Bob轮流从中取出数字,Alice先手。获胜的条件是所有手中的数字的异或值比对方大。两个人都极聪明,因此他们都会用最佳策略来选择数字。给定这n个数字,求游戏结果。并且如果Alice获胜,请输出她第一个数该选什么。

思路:将所有数字以二进制表示,并对齐成一个矩阵,考察每一列中1的个数。
首先,对最高位进行考察,即对矩阵的第一列进行考察。如果最高为的1的的个数为偶数,那么最终两个人手上的数字中最高为为1的个数必然都是偶数,最终两人异或得到的数字这一位都是0,无法判断胜负,需要再根据次高位的数字进行判断是否能分出胜负。

如果最高为的1的的个数奇数,那么最终两个人手上的数字中最高为为1的个数是一奇一偶,那么在异或之后,两个人的最终得到的数字的最高为必然一个为0,一个为1(偶数个1异或之后为0)。那么,只要能保证自己在这一轮,能拿到奇数个1,Alice即可获胜。

如果这一列1的个数为4k+1型,那么Alice有必胜策略。4k+1个数,需要保证自己比对方对一个数即可。那么Alice只需要先拿一个1,之后Alice只要跟着Bob拿,保证后来两个人拿到的1个数相等就行了。Bob拿0,Alice就拿0,反之亦然。如果0的个数为偶数,自然没问题。如果为奇数,那么到最后剩下1个0,Bob拿了之后Alice没有可拿的了。但是剩下的都是1,且为偶数个,最终两人拿到的1的个数仍然相等。Alice最终那个奇数个1,Alice胜。至于拿的方法,只要开始拿1就行了,具体哪个无所谓。

如果这一列的1的个数为4k+3型,那么胜负结果需要根据余下的0的个数来判断。因为4k+3平分之后为奇数,所以多拿的人会输。因此,只要保证对方比自己多拿一个,自己就能获胜。

如果0的个数为奇数,Alice有必胜策略。Alice先拿一个0。由于0的个数为奇数,因此Bob不得不比Alice先拿1。等Bob拿到1之后,如果还有0,Alice就拿1。直至没有0为止,然后两人平分剩下的1。Bob多了一个,Alice胜。Alice先拿一个0即可。
如果0的个数为偶数,Bob有必胜策略。他只需要跟着Alice拿即可。无论如何,Alice必然比Bob先拿1,Alice必败。

如果这一位的1的个数为偶数,则依次考察下一位。直至考察结束,如果仍没分出胜负,那么二人打平。

原题目为英文版,详见:Hackerearch:August Circuits
本人Hackearth账号:Hansyang’s Hackearth Count

0 0
原创粉丝点击