题目来源:http://acm.nyist.cf/problem/1582
题目描述:
有n个人想要下棋(1 对 1),但是大家都想和与自己水平差不多的人下棋,已知每个人都有一个实力值,如果俩人实力相差 >= k,那么他们就不会浪费时间去切磋棋艺。求最多需要多少棋盘,两个人互相切磋只需要一个棋盘。
输入描述:
第一行一个整数t,表示t组输入,t <= 100 接下来t组数据,每组数据第一行有两个整数用空格分隔表示n,k,(1 <= n,k <= 1000)。 每组数据第二行,有n个整数用空格分隔表示a_i,(0 <= a_i <= 10000)
输出描述:
每组数据输出一个整数占一行表示最多需要多少棋盘
样例输入:
复制
1 5 2 1 2 3 4 5
样例输出:
2
提示:
来源:
上传者:ToRe
思路:
假设4人,a1,a2,a3,a4,从小到大排序,如果a3-a1,a4-a2都成立,那么a2-a1,a4-a3一定成立。
所以排个序,扫过去即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#include<queue>
const double pi = acos(-1);
const int N=1e6+5;
#define mm(a) memset(a,0,sizeof(a))
using namespace std;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0; i<n; ++i)
scanf("%d",&a[i]);
sort(a,a+n);
int ans=0;
for(int i=1; i<n; ++i)
if(a[i]-a[i-1]<k)
{
ans++;
i++;
}
printf("%d\n",ans);
}
return 0;
}
学长代码:
#include<bits/stdc++.h>
using namespace std;
int v[1005];
int main()
{
int t;
// freopen("C:\\Users\\54153\\Desktop\\***.in","r",stdin);
// freopen("C:\\Users\\54153\\Desktop\\mmp.out","w",stdout);
for(scanf("%d",&t); t; --t)
{
int n, k;
scanf("%d%d",&n,&k);
for(int i = 0; i < n; ++i) scanf("%d",&v[i]);
sort(v,v+n);
int ans = 0;
for(int i = 0; i < n-1; ++i)
{
if(v[i+1]-v[i] >= k) continue;
++ans;
++i;
}
printf("%d\n",ans);
}
return 0;
}