Educational Codeforces Round 64 (Rated for Div. 2)-C. Match Points

C. Match Points
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output


You are given a set of points x1,x2,...,xn on the number line.

Two points i and j can be matched with each other if the following conditions hold:

neither i nor j is matched with any other point;
|xi−xj|≥z.
What is the maximum number of pairs of points you can match with each other?

Input
The first line contains two integers n and z (2≤n≤2⋅105,1≤z≤109) — the number of points and the constraint on the distance between matched points,respectively.

The second line contains n integers x1,xn (1≤xi≤109).

Output
Print one integer — the maximum number of pairs of points you can match with each other.

Examples
input
4 2
1 3 3 7
output
2
input
5 5
10 9 5 8 7
output
1
Note
In the first example,you may match point 1 with point 2 (|3−1|≥2),and point 3 with point 4 (|7−3|≥2).

In the second example,you may match point 1 with point 3 (|5−10|≥5).

 

 题目:http://codeforces.com/contest/1156/problem/C

 

题意 : 长度为n的数组, 选择两个数,要求|差值| >= k, 但是被选择过的数不允许被再次选择,问 最大的匹配对数。

在一开始,我想用尺选法+标记数组来求解这个问题,但是卡在了第七个数据上,这组数据的n是200000,正确答案是100000,而我输出了9913,小于正确答案。

我就很困惑,直到看到别人博客里的一组数据  n = 4,k = 4  arr =  {4 8 9 12} 这组数据用我一开始的程序来算的话是 1 而正确答案是2

 

 

尺选法+标记数组 WA on test7

分享图片

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2e5+5;
int arr[maxn];
int vis[maxn]={};
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&arr[i]);
    sort(arr,arr+n);
    int cnt = 0;
    int i=0,j=0;
    while(j<n){
        while(arr[j]-arr[i] < k && j<n)j++;
        if(j>=n)break;
        vis[j] = 1;
        j++;
        cnt++;
        i++;
        while(vis[i] && i<n)i++;
    }
    printf("%d\n",cnt);
    return 0;
}
View Code

 

AC代码

分享图片

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 2e5+5;
int arr[maxn];

int main(){
    int n,j=n/2;
    for(;i<n/2;i++){
        for(;j<n;j++){
            if(arr[j]-arr[i]>=k){
                cnt++;j++;
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}
View Code

 

 

还可以二分做,

链接https://blog.csdn.net/pythonbanana/article/details/89786072

相关文章

Css3如何实现鼠标移上变长特效?(图文+视频)
css3怎么实现鼠标悬停图片时缓慢变大效果?(图文+视频)
jquery如何实现点击网页回到顶部效果?(图文+视频)
css3边框阴影效果怎么做?(图文+视频)
css怎么实现圆角边框和圆形效果?(图文+视频教程)
Css3如何实现旋转移动动画特效