题解:本来以为是要求递推式,真去求出数学期望,然后再取最大值对应A的排列。后来发现一个规律,就是给定一个n ,k越大, F(n,k)是单调递减的(大概是因为,越到后面,越来越多的子集的最小值变成了整个数列的最小值或者次小值)。所以只要将A最大的对应B最小的即可。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
#define N 200005
int a[N],ans[N];
struct node{
int num;
int i;
}b[N];
int cmp(node a, node b){
return a.num > b.num;
}
int main()
{
int n;
cin >> n;
for(int i = 0;i < n; ++i)
cin >> a[i];
for(int i = 0;i < n; ++i){
b[i].i = i;
cin >> b[i].num;
}
sort(a,a+n);
sort(b,b+n,cmp);
for(int i = 0;i < n; ++i)
ans[b[i].i] = a[i];
for(int i = 0;i < n; ++i)
cout << ans[i] << " ";
return 0;
}