2020牛客寒假算法基础集训营6.A——配对【贪心】

题目传送门


题目描述

现在有正整数集合 A 和 B,每个集合里有 N 个数,你要建立他们间的一一映射
将每对配对的数字相加可以得到 N 个和,你要做的就是最大化第 K 大的和
1 K N 100 , 000 1≤K≤N≤100,000 输入的所有数字不超过 1 0 8 10^8


输入描述:

第一行 2 个数字 N,K
接下来两行,每行 N 个正整数,分别表示 A 和 B 中的元素


输出描述:

一行,表示第 K 大的和的最大值


输入

3 2
1 2 3
1 2 3


输出

5


题解

  • 首先组成k对数字的话,肯定是两组数组中各自选出K大个数,然后在这2k个数中匹配
  • 那么假设有 a 1 < a 2 < a 3 < a 4 ; b 1 < b 2 < b 3 < b 4 a_1<a_2<a_3<a_4;b_1<b_2<b_3<b_4
  • 那么第四大的数,也就是说,在所有组合中,想要最小的数最大,那么肯定是首位组合。
  • 也就是 a 1 + b 4 , a 2 + b 3 , a 3 + b 2 , a 4 + b 1 a_1+b_4,a_2+b_3,a_3+b_2,a_4+b_1 中找最小的。
  • 那么代码就很好写了,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;
	}
}
发布了192 篇原创文章 · 获赞 120 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104335198