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

本文解析了一个有趣的算法题目“万万没想到之抓捕孔连顺”,旨在求解给定点集内,所有可能的三点组合中,任意两点间距离不超过给定阈值的组合数量。通过枚举固定点并计算其余点对的组合,巧妙地利用了数学组合公式,最终实现了高效求解。

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

题意

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

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

解题思路:

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

这个规律怎么找呢?

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

#include <bits/stdc++.h>
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值