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

被折叠的 条评论
为什么被折叠?



