2020牛客寒假算法基础集训营6.A——配对【贪心】
原创
©著作权归作者所有:来自51CTO博客作者Nirvana柒的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目传送门
题目描述
现在有正整数集合 A 和 B,每个集合里有 N 个数,你要建立他们间的一一映射
将每对配对的数字相加可以得到 N 个和,你要做的就是最大化第 K 大的和
输入的所有数字不超过
输入描述:
第一行 2 个数字 N,K
接下来两行,每行 N 个正整数,分别表示 A 和 B 中的元素
输出描述:
一行,表示第 K 大的和的最大值
输入
3 2
1 2 3
1 2 3
输出
5
题解
- 首先组成k对数字的话,肯定是两组数组中各自选出K大个数,然后在这2k个数中匹配
- 那么假设有
- 那么第四大的数,也就是说,在所有组合中,想要最小的数最大,那么肯定是首位组合。
- 也就是
- 那么代码就很好写了,sort下,找一遍即可
AC-Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
int a[maxn], b[maxn];
int main() {
int n, k; while (cin >> n >> k) {
for (int i = 0; i < n; ++i)
cin >> a[i];
for (int i = 0; i < n; ++i)
cin >> b[i];
sort(a, a + n);
sort(b, b + n);
int ans = 2e8;
for (int i = 0; i < k; ++i)
ans = min(ans, a[n - k + i] + b[n - i- 1]);
cout << ans << endl;
}
}