贪心
题目

\(f(n,k)\) 表示 区间 \([1,n]\) 选出 \(k\) 个元素的集合的期望最小值,
现在需要重排 \(a\) 数组,使得 \(\sum_{i=1}^mf(a_i,b_i)\) 最大


分析

\[f(n,k)=\frac{\sum_{i=1}^ni*C(n-i,k-1)}{C(n,k)} \]

这个式子可以推出来答案是 \(\frac{n+1}{k+1}\)

还可以通过模型转换,

期望最小值也就是 \([0,n+1]\) 的线段分为 \(k+1\) 个部分,

最左边线段的期望长度也就是 \(\frac{n+1}{k+1}\)

不管怎样,拿 \(a\) 中 大的与 \(b\) 中小的匹配即可


代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011;
int a[N],b[N],rk[N],Rk[N],ans[N],n;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(int ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
bool cmp0(int x,int y){return a[x]>a[y];}
bool cmp1(int x,int y){return b[x]<b[y];}
signed main(){
	n=iut();
	for (rr int i=1;i<=n;++i) a[i]=iut(),rk[i]=i;
	for (rr int i=1;i<=n;++i) b[i]=iut(),Rk[i]=i;
	sort(rk+1,rk+1+n,cmp0),sort(Rk+1,Rk+1+n,cmp1);
	for (rr int i=1;i<=n;++i) ans[Rk[i]]=a[rk[i]];
	for (rr int i=1;i<=n;++i) print(ans[i]),putchar(i==n?10:32);
	return 0;
}