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; }
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; }
还可以二分做,
链接 : https://blog.csdn.net/pythonbanana/article/details/89786072