牛客网字节跳动算法题:万万没想到之抓捕孔连顺

题目链接:万万没想到之抓捕孔连顺

题意

输入一个n,d,n代表n个点,d间隔代表最大距离,然后输入n个点

问有多少种组合,三个点的最大差值小于d

解题思路:

   当两点距离刚好在范围内时,通过规律可以发现  ,此时的组合为 n*(n-1) / 2,那么只需寻找极限距离即可

这个规律怎么找呢?

先拿出一个固定点,其余两点在不重复的情况下的组合就是答案

#include 
using namespace std;
long long mod = 99997867;
long long a[1000001];
int main(){
    long long n, d;       // long long ,不然会爆掉
    cin >> n >> d;
     
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    long long ans = 0;
    long long l = 1;
    for(long long r = 1; r <= n; r++){
        while(a[r] - a[l] > d){        // 寻找极限距离
            l++;
        }
        ans = (ans + ((r-l)*(r-l-1)/2) % mod) % mod;    // 此时组合数
    }
    cout << ans << endl;
    return 0;
}

 

你可能感兴趣的:(数学)