字节跳动2019春招研发机试题 万万没想到之抓捕孔连顺
我叫王大锤,是一名特工。我刚刚接到任务:在字节跳动大街进行埋伏,抓捕*孔连顺。和我一起行动的还有另外两名特工,我提议。。。。
这其实是一道数学题。
首先要求两个特工不能在一起,且特工等价,也就是说在n个符合距离条件的位置中,选出给2两个位置给A、B后,剩下的只能是给C,数量为
注意,不是从n个中选3个,因为选三个的话就表示特工不等价了。
其次是因为坐标是从小到大排序的,所以,只要在一定的坐标范围内(最大坐标-最小坐标)<D,那么这个范围内的任意三个坐标都是符合的。将这个范围内的坐标进行排列就可以了。
最后,将所有排列数求合就可以了。
import java.util.Scanner;
public class Main2
{
public static void main(String arg[])
{
long n, d, count = 0;
Scanner in=new Scanner(System.in);
n=in.nextInt();
d=in.nextInt();
int v[]=new int[(int)n];
for (int i = 0, j = 0; i < n; i++) //采用双指针,i指向最大坐标,j指向最小坐标
{
v[i]=in.nextInt();
while (i >= 2 && (v[i]-v[j])> d) //如果(最大坐标-最小坐标)>D,则将指针移到下一个最小坐标,直到(最大坐标-最小坐标)<D
{
j++;
}
count += caculate(i - j); //i-j表示:i和j之间有几个符合条件的坐标
}
in.close();
System.out.println(count % 99997867);
}
public static long caculate(long n) //n个符合条件的坐标中有多少种符合条件的排列
{
return (n-1) * n / 2;
}
}