题目链接:点击查看
题目大意:给出两个由 n 个数字组成的数列 a 和 b ,现在题目要求我们让两个数列中建立映射,每对映射的贡献为两个数相加,即a[ i ] + b[ j ],现在求出第 k 大的数的最大值
题目分析:好像是比较简单的一个贪心题,比赛的时候看过的人比较多,但奈何贪心和构造克我,想了半天也没什么思路,首先是文字游戏有个坑,第 k 大,的意思是第 n + 1 - k 小,稍微体会一下这个意思就会发现是要求从最大的那边往小的方向数 k 个单位,不过没有什么很大的影响,其实通过样例我们可以稍微看出,如果想要组成答案,那么可以让最大的那些数交叉,至于怎么交叉我当时没推出来,题解说的是如果要组成前 k 大的数字,显然要用数组 a 中最大的 k 个数和数组 b 中最大的 k 个数,然后说通过数学归纳可得交叉相加最优。。我也不太懂,不过自己稍微造几组样例应该就能差不多猜出来了吧
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int N=1e5+100;
int a[N],b[N];
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
//#endif
// ios::sync_with_stdio(false);
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=n;i++)
scanf("%d",b+i);
sort(a+1,a+1+n);
sort(b+1,b+1+n);
k=n+1-k;
int ans=inf;
for(int i=k;i<=n;i++)
ans=min(ans,a[i]+b[n+k-i]);
printf("%d\n",ans);
return 0;
}