一 题面
二 分析
根据题意很容易想到要去找满足条件的数,因为可以打乱输入的顺序,所以很容易想到二分。
但是如果直接对输入的数组进行二分,如输入$a$,直接在数组里二分找$a+z$,就会出现不是最优解的情况,例如:
$4 8 9 12$ 其中$z = 4$
如果从第一个数直接二分那样找就会出问题。
那么我们可以思考任意一个数组最优的解是多少?其实就是$n/2$。那么排序后,肯定可以从中间那个位置划分,后面的每个数可以找到最前面的数相对应。那么我们直接遍历一下右半部分的数组,为了找到更多的解,肯定要在满足条件的情况下,在左半部分数组中找最小的,相当于两个指针扫就可以了。
三 AC代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 2e5 + 10; 4 int Data[MAXN]; 5 6 int main() 7 { 8 ios::sync_with_stdio(false); 9 int n, z, ans = 0; 10 int l, r; 11 cin >> n >> z; 12 for(int i = 0; i < n; i++) 13 cin >> Data[i]; 14 sort(Data, Data + n); 15 l = 0; 16 if(n % 2 == 1) 17 r = n/2 + 1; 18 else 19 r = n/2; 20 while(r < n) 21 { 22 if(Data[l] + z <= Data[r]) 23 { 24 ans++; 25 l++; 26 } 27 r++; 28 } 29 cout << ans << endl; 30 return 0; 31 }