YACS|T4 团队竞赛|第四届上海市青少年算法竞赛(小学组)线上同步赛

 T4 团队竞赛icon-default.png?t=N4P3https://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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值