T4 团队竞赛https://www.iai.sh.cn/problem/800
题目描述
信息学竞赛在不同的比赛中,通常有不同的赛制,其中就有一种由 3 位选手组队的团体比赛。
现有 n 名学生,其中第 iii 名学生有编程能力值 ai ,小爱老师需要从中选出 3 名选手参加本次比赛。为了不让团队的实力过于悬殊,他希望选出的 333 名选手相互之间能力值之差不超过 X。
请你帮助小爱老师计算一下,有多少种组队方法?
(注意:相同的三位学生组队,只计一种选法,即不考虑选出学生相互之间的先后顺序)
输入格式
输入共两行:
输入第一行,两个正整数 n,X
输入第一行,n 个正整数 a1,a2,...,an
输出格式
输出只包含一个正整数,表示最终答案的方案数
数据范围
- 对于30%,1≤n≤100
- 对于50%,1≤n≤10^3
- 对于100%,1≤n≤10^5 ,1≤ai,X≤10^9
样例数据
输入:
4 20 30 20 10 40
输出:
2
说明:
{10,20,30},{20,30,40} 共2中选法
#include <bits/stdc++.h>
using namespace std;
int a[100005];//student
int main () {
int n, x, j=1;
long long ans=0,k;
cin>>n>>x;
for(int i=1; i<=n; i++){
cin>>a[i];
}
sort(a+1, a+n+1);
//选定第 i 位同学,再从1~i-1名同学中选两位
for(int i=3; i<=n; i++){
//查找与 i 能力差最大的同学
/* //本方法超时
j = i-1;
while(j>=1 && (a[i]-a[j])<=x){
//¿ÉÒÔд³Édo{}while();
j--;
}
j++;
*/
while((a[i]-a[j])>x){//优化查找方法
j++;
}
k = i-j;
if(k>=2){//k名同学中选择两位 C(2,k)
ans += k*(k-1)/2; //long long
}
}
cout<<ans;
return 0;
}