题目来源:码蹄集
https://matiji.net/exam/brushquestion/12/3181/1DC60EA6DF83A333301CFFE1407FBA59
参考程序:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,d,a[100100],r=2,ans=0;//r是能与第i只竹鼠配对的最右边的竹鼠的编号
cin>>n>>d;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<n;i++)
{
while(r<=n&&a[r]-a[i]<=d)r++;
r--;
//此时的r是能与第i只竹鼠配对的最右边的竹鼠的编号
ans+=(r-i);//r-i是[i,r]范围内能与i号竹鼠配对的竹鼠数量,也就是i号竹鼠右边所有能与它配对的竹鼠数量,不用统计左边的原因是,左边被前面的循环的右边统计过了。
}
cout<<ans<<endl;
return 0;
}