[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. 您可以假设数组的长度最 ...
随机推荐
- Kaggel比赛 : [Give Me Some Credit]
通过预测在未来两年内某人将经历财务困境的可能性,改善信用评分的状态. Description 银行在市场经济中扮演着至关重要的角色.他们决定谁可以获得融资,以及什么条件,可以做出或破坏投资决策.为了让 ...
- 经典排序js实现
https://www.cnblogs.com/onepixel/articles/7674659.html
- Unity3D外包(u3d外包)—就找北京动点软件(我们长年承接U3D外包、Maya、3DMax项目外包)
一.关于动点: 北京动点飞扬软件,因致力于虚拟现实技术的开发而创立,在虚拟现实开发领域有着卓越的技术和领先的思想. 我们为用户专业定制的项目,细分了多种工作流程,软件独立自主研发,编程简化用户操作 ...
- linux使用代理进行apt安装 以 nord 为例
我的环境:(不必完全一样,只是提一下)----------- linux系统:kali 桌面:xface ----------------------------------------------- ...
- _mount_vendor
允许NPC售卖坐骑时进行预览
- xml.libxml2_添加带tagname的xml文本(xmlNewTextChild)
1. 2.例子代码: int TgText::NodeNew_G2SVG(xmlNode* _pNodeCurrent_G, xmlNode* _pNodeParent_SVG, xmlNode** ...
- iOS10 后 http 网页定位失效解决方案
最近公司开发一个app项目H5+ MUI框架进行开发的,开发的相关人员离职后,我这个小菜鸟...都是泪(从未接触过app开发) 项目要嵌入百度地图,由于已经做了微信版本的,想着还是用js api 做吧 ...
- [JavaScript] 邮箱验证
1.JQuery $(function(){ $("#username").blur(function(){ var temp=$("#username"); ...
- hive新功能cube和rollup
1.cube简称数据魔方,可以实现hive多个任意维度的查询,cube(a,b,c)则首先会对(a,b,c)进行group by,然后依次是(a,b),(a,c),(a),(b,c),(b),(c), ...
- [hdu P3085] Nightmare Ⅱ
[hdu P3085] Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...