[CSL 的魔法][求排序最少交换次数]
链接:https://ac.nowcoder.com/acm/contest/551/E
来源:牛客网
题目描述
第一行有一个整数 n,表示序列的长度。 接下来两行,每行有 n 个整数,分别表示初始序列 a 和 b。
1≤ai,bi≤1e9
在一行输出一个整数,表示最少使用的魔法次数。
2
1 2
1 2 输出
1
2
1 2
2 1 输出
0
题意:两个数组,你每次可以交换任一个数组里两个元素的位置,求最小交换次数使a0b0+a1b1+…+an−1bn−1a0b0+a1b1+…+an−1bn−1的值最小化。
题解:易知应该令a数组最大*b数组最小..依次进行,所以问题变成了使a数组(或者b数组)变成一个有序(特定的顺序)数组的最小次数,而使数组变成有序的最小次数==数组大小-循环节数,这里的循环节数就是:举例:如1 4 5 2 6 3 的循环节数就是3,即【1】【4 2】【5 6 3】
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
struct pot{
int id;
int val;
}p[],p1[];
bool cmp(struct pot aa,struct pot bb){
return aa.val<bb.val;
}
int a[];
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){scanf("%d",&p[i].val);p[i].id=i;}
for(int i=;i<=n;i++){scanf("%d",&p1[i].val);p1[i].id=i;}
sort(p+,p++n,cmp);
sort(p1+,p1++n,cmp);
for(int i=;i<=n;i++){
a[p1[n-i+].id]=p[i].id;
}
int ans=;
for(int i=;i<=n;i++){
if(a[i]==i)ans++;
}
for(int i=;i<=n;i++){
if(a[i]==i)continue;
ans++;
int xx=a[i];
while(a[xx]!=xx){
int t=a[xx];
a[xx]=xx;
xx=t;
}
}
cout<<n-ans<<endl;
return ;
}
[CSL 的魔法][求排序最少交换次数]的更多相关文章
- 使序列有序的最少交换次数(minimum swaps)
交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...
- [小米OJ] 8. 最少交换次数
求逆序对数即可 function solution(line) { var nums = line.split(","); var res = 0; for (let i = 0; ...
- Cycle Sort (交换次数最少的排序)
该算法的效率并不高.但是却提供了一个很好的思路.如何让一个序列在最小交换次数下实现有序. Cycle Sort 翻译成中文是 圈排序. 这个圈在于需要交换的数据形成圈. 具体一点: 如: Array ...
- php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)
php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...
- AtCoder Beginner Contest 116 C题 【题意:可以在任意区间【L,R】上加1,求通过最少加1次数得到题目给定的区间】】{思维好题}
C - Grand Garden In a flower bed, there are NN flowers, numbered 1,2,......,N1,2,......,N. Initially ...
- POJ2431贪心(最少加油次数)
题意: 给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- nyoj最少乘法次数——快速幂思想
最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...
- LeetCode:最少移动次数使得数组元素相等||【462】
LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最 ...
随机推荐
- jsp/servlet学习四之jsp初窥
jsp页面本质上是一个servlet,jsp页面是一个以.jsp结尾的文本文件. jsp自带的API包含4个包: javax.servlet.jsp.包含用于servlet/jsp容器将jsp页面翻译 ...
- 【虚拟机】解决网络适配器没有 VirtualBox Host-Only Ethernet Adapter 问题
下面以windows系统来演示重新安装 VirtualBox Host-Only Ethernet Adapter的方法 1.“win+r”输入“devmgmt.msc”,出现如下界面: 2.点击菜单 ...
- Kafka学习之二 Kafka安装和使用
部署环境Linux(Centos 6.5),JDK 1.8.0,zookeeper-3.4.12,kafka_2.11-2.0.0. 1. 单机环境 官方建议使用JDK 1.8版本,因此本文使 ...
- Java ceil() 方法
语法: double ceil(double d) double ceil(float f) 参数 double 或 float 的原生数据类型. 返回值 返回 double 类型,返回值大于或等于给 ...
- guxh的python笔记六:类的属性
1,私有属性 class Foo: def __init__(self, x): self.x = x 类的属性在实例化之后是可以更改的: f = Foo(1) print(f.x) # 1 f.x ...
- Lab 6-3
In this lab, we'll analyze the malware found in the file Lab06-03.exe. Questions and Short Answers C ...
- linux存储管理之自动挂在
自动挂载 Automount ==================================================================================== ...
- BootCamp 在MacBook 上安装Win10
首先到网上下载win10的ISO光盘, 制作win10安装盘时,一直停在copy文件.最后文件还是没有copy完整. 需要手工把iso里的文件拷贝到U盘里. 否则提示source\install.wi ...
- 1-express学习
1.在安装完node.js后,在Windows里面的cmd命令下,输入:express myapp --ejs 2.打开创建的工程myapp目录:cd myapp 3.安装:npm install 4 ...
- 微服务架构演变过程-SpringCloud