排序最小交换代价

这篇博客探讨了在ACM竞赛题集中关于排序的问题。CSL的魔法允许在两个序列中任意交换元素位置以最小化特定加权和。文章详细介绍了如何通过这种魔法进行排序,以达到序列加权和最小化的目标。
摘要由CSDN通过智能技术生成

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
数学:https://blog.csdn.net/weixin_39778570/article/details/88048181

CSL的魔法

题目:https://ac.nowcoder.com/acm/contest/551/E
有两个长度为 n 的序列,a0,a1,…,an−1和
b0,b1,…,bn−1。CSL 有一种魔法,每执行一次魔法,可以任意挑选一个序列并任意交换序列中两个元素的位置。CSL 使用若干次魔法,得到最终的序列 a 和 b,并且想要让
a0b0+a1b1+…+an−1bn−1的值最小化。求解 CSL 至少使用多少次魔法,能够达到最小化的目标。

根据排列不等式,需要一大一小排列
那么我们只需要改变一个序列就行了
把a序列最大的调到b序列最小的位置,次大调到次小,依次类推

对a降序排序,记录下标
对b升序排序,记录下标

根据两个记录好的下标数组求出a调整之后的下标序列

然后这些调整之后的下标能构成多个环
把一个长度为n的环拆为n个自环需要n-1次操作,自环0次 
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int N=1e5+5;
struct node{
   
	int idx,val;
}a[N],b[N];
int n,a_to_b[N];
bool vis[N];
bool cmp1(const node &a, const node &b){
   
	return a.val>b.val;
}
bool cmp2(const node &a, const node &b){
   
	return a.val<b.val;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值