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 @ 2024-01-20 18:08  liyilang2021  阅读(6)  评论(0编辑  收藏  举报