题目来源: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;
}