牛客 - 配对(贪心+数学)

题目链接:点击查看

题目大意:给出两个由 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;
}
发布了646 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/104337899
今日推荐