#mengxiongP6. 完善程序(一)-选择数对
完善程序(一)-选择数对
完善程序(一)- 选择数对
题目描述
(选择数对) 有 n 个小朋友分别拿着一个数字,现在要求你将小朋友两两配对,要求每对小朋友手上的数字之差大于给定值 k。问最多可以从数组中选出多少对符合条件的小朋友。(每个小朋友最多只能和另外一个小朋友配对,不能脚踏两条船)
输入格式: 第一行给出 n, k 分别表示小朋友的个数,以及参数 k。接下来给出 n 个数字,表示每个小朋友手上的数字。
数据范围: 1 ≤ n, k ≤ 10⁵
提示: 二分最终的结果,对于二分的结果 mid,在 check 函数中 O(n) 判断能否选出 mid 对小朋友符合要求,最终保留二分的结果。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], n, k;
bool check(int mid) { // 要配对 mid 队
bool flag = true;
for(int i = 1, 【1】; j <= n; j++, i++) {
if(【2】)
flag = false; // 不满足要求
}
return flag;
}
int main() {
cin >> n >> k;
for(int i = 1; i <= n; i++)
cin >> a[i];
int l = 【3】, r = n, ans;
sort(a+1, a+1+n);
while(l <= r) {
int mid = (l + r) / 2;
if(check(mid)) {
【4】;
ans = mid;
} else {
【5】;
}
}
cout << ans << endl;
}
第 1 题(20 分) 1 处应该填的代码是:{{ select(1) }}
- A. j = 1
- B. j = n - mid
- C. j = n - mid + 1
- D. j = mid
第 2 题(20 分) 2 处应该填的代码是:{{ select(2) }}
- A. a[i] - a[j] > k
- B. a[i] - a[j] <= k
- C. a[j] - a[i] > k
- D. a[j] - a[i] <= k
第 3 题(20 分) 3 处应该填的代码是:{{ select(3) }}
- A. 1
- B. 0
- C. n/2
- D. a[1]
第 4 题(20 分) 4 处应该填的代码是:{{ select(4) }}
- A. l = mid
- B. r = mid
- C. l = mid + 1
- D. r = mid - 1
第 5 题(20 分) 5 处应该填的代码是:{{ select(5) }}
- A. l = mid
- B. r = mid
- C. l = mid + 1
- D. r = mid - 1