字节跳动练习题---特工埋伏

原题链接如下

特工埋伏

题目描述如下:

我叫王大锤,是一名特工。我刚刚接到任务:在字节跳动大街进行埋伏,抓捕***孔连顺。和我一起行动的还有另外两名特工,我提仪

  1. 我们在字节跳动大街的N个建筑中选定3个埋伏地点。
  2. 为了相互照应,我们决定相距最远的两名特工间的距离不超过D。
    我特喵是个天才! 经过精密的计算,我们从X种可行的埋伏方案中选择了一种。这个方案万无一失,颤抖吧,孔连顺!
    ……
    万万没想到,计划还是失败了,孔连顺化妆成小龙女,混在cosplay的队伍中逃出了字节跳动大街。只怪他的伪装太成功了,就是杨过本人来了也发现不了的!
    请听题:给定N(可选作为埋伏点的建筑物数)、D(相距最远的两名特工间的距离的最大值)以及可选建筑的坐标,计算在这次行动中,大锤的小队有多少种埋伏选择。
    注意:
  3. 两个特工不能埋伏在同一地点
  4. 三个特工是等价的:即同样的位置组合(A, B, C) 只算一种埋伏方法,不能因“特工之间互换位置”而重复使用

解题思路:

1.暴力法
2.双指针移动法

思路详解:

1.暴力法:
2.双指针移动法:
对于一个点,我们考虑从以这个点加入,到底会有多少种的选择:
1.首先,距离这个点超过D距离的点肯定是不能和这个点共同组合成埋伏的区间的。
2.那么,我们就很自然地能够想到在距离这个点为D的这个区间的所有点才有可能和它一起组合。
3.那么,这个区间有左有右,如果要遍历一个数组,如果不是二分遍历的话,通常都是沿着一个方向的。如果两个方向的点都算进去,那么势必会照成重复计算的结果。那么如果只按照一个方向来进行呢?
4.那是肯定可以的。为什么呢?因为你一个点的左区间的所有可能性已经被上面一个点给涵盖住了,所以,通常我们都是从左到右来算的。
5.那么,最关键的就是怎么算呢?对于这一个点,想要在和它构成埋伏方案。那么首先需要在它的右区间选出一个点,然后呢,再选出一个点。这就很显然了呢!假设我们可以通过一种方式计数右区间的所有点的数量N,那么很显然,根据排列组合知识可以得出对于这个点而言,这个结果应该是N*(N-1)/2;
所以,我们可以先来一重的for,for每一个点,然后再for,for到最后一个在它右区间的点,然后呢,计算这个区间的点,就可以按照公式来了。

 代码丢失,以后补充!
全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务