题目链接:http://codeforces.com/contest/1156/problem/C
题目大意:给你一个n个元素的数组,和一个z。求使得 (a[i]-a[j])>=z) 的最大对数。(n<=2e5)
思路:最开始的思路 贪心是把a加入multiset每次查找>=s.begin()+z的元素。同时删除两个元素。
然后推出一个样例:证明并不可行。
4 3
1 4 5 7
如果(1, 4)匹配。那么只有一对。如果(1, 5), (4, 7)就有两对。
正确思路:把a数组排序。分成2半。前面与后面匹配。
#include<bits/stdc++.h>
#define LL long long
int a[200005];
int main()
{
int n, m;
scanf("%d%d",&n,&z);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a, a+n);
int L=0, R=n/2, ans=0;
while(L<n/2&&R<n)
{
if(a[R]-a[L]>=z)//满足条件
{
ans++;
L++, R++;
}
else
{
R++; //不满足条件时。R++。因为a[L]最小。如果a[L]都不能与a[R]匹配。a[i>L]就更不能与a[R]匹配。
}
}
cout<<ans<<endl;
return 0;
}