CF1833B

由于题目保证有解,因此可以保证一定不超过 \(k\),可以忽略这个条件。要使得 $ |a_i - b_i| $ 最小,很容易想到贪心做法,将 \(a\)\(b\) 分别排序,将位置相同的两个作为一对计算答案。显然这种做法能保证答案最小,证明过程不详解。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n,k,c[1000001];
struct d
{
	int v;
	int id;
}a[1000001],b[1000001];

bool cmp( d x , d y )
{
	return x.v < y.v;
}

int main()
{
	int T;
	cin >> T;
	while( T -- )
	{
		cin >> n >> k;
		for( int i = 1 ; i <= n ; i ++ )
			cin >> a[i].v,a[i].id = i;
		for( int i = 1 ; i <= n ; i ++ )
			cin >> b[i].v,b[i].id = i; 
		sort( a + 1 , a + n + 1 , cmp );
		sort( b + 1 , b + n + 1 , cmp );	
		for( int i = 1 ; i <= n ; i ++ )
			c[a[i].id] = b[i].v;
		for( int i = 1 ; i <= n ; i ++ )
			cout << c[i] << ' '; 
		cout << endl;
	}
	return 0;
} 
posted @   liyilang2021  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示