链接:https://ac.nowcoder.com/acm/contest/551/E
来源:牛客网
题目描述

有两个长度为 n 的序列,a0,a1,…,an−1a0,a1,…,an−1和 b0,b1,…,bn−1b0,b1,…,bn−1。CSL 有一种魔法,每执行一次魔法,可以任意挑选一个序列并任意交换序列中两个元素的位置。CSL 使用若干次魔法,得到最终的序列 a 和 b,并且想要让 a0b0+a1b1+…+an−1bn−1a0b0+a1b1+…+an−1bn−1的值最小化。求解 CSL 至少使用多少次魔法,能够达到最小化的目标。
输入描述:
  1. 第一行有一个整数 n,表示序列的长度。
  2.  
  3. 接下来两行,每行有 n 个整数,分别表示初始序列 a b
输入数据保证每个序列里的数两两不同。
 
2≤n≤1e5
1≤ai,bi≤1e9
输出描述:
  1. 在一行输出一个整数,表示最少使用的魔法次数。
示例1
输入
  1. 2
  2. 1 2
  3. 1 2
  4.  
  5. 输出
  1. 1
示例2
输入
  1. 2
  2. 1 2
  3. 2 1
  4.  
  5. 输出
  1. 0
    题意:两个数组,你每次可以交换任一个数组里两个元素的位置,求最小交换次数使a0b0+a1b1+…+an1bn1a0b0+a1b1+…+an1bn1的值最小化。
    题解:易知应该令a数组最大*b数组最小..依次进行,所以问题变成了使a数组(或者b数组)变成一个有序(特定的顺序)数组的最小次数,而使数组变成有序的最小次数==数组大小-循环节数,这里的循环节数就是:举例:如1 4 5 2 6 3 的循环节数就是3,即【1】【4 2】【5 6 3
  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<queue>
  8. using namespace std;
  9. typedef long long ll;
  10. struct pot{
  11. int id;
  12. int val;
  13. }p[],p1[];
  14. bool cmp(struct pot aa,struct pot bb){
  15. return aa.val<bb.val;
  16. }
  17. int a[];
  18. int main(){
  19. int n;
  20. scanf("%d",&n);
  21. for(int i=;i<=n;i++){scanf("%d",&p[i].val);p[i].id=i;}
  22. for(int i=;i<=n;i++){scanf("%d",&p1[i].val);p1[i].id=i;}
  23. sort(p+,p++n,cmp);
  24. sort(p1+,p1++n,cmp);
  25. for(int i=;i<=n;i++){
  26. a[p1[n-i+].id]=p[i].id;
  27. }
  28. int ans=;
  29. for(int i=;i<=n;i++){
  30. if(a[i]==i)ans++;
  31. }
  32. for(int i=;i<=n;i++){
  33. if(a[i]==i)continue;
  34. ans++;
  35. int xx=a[i];
  36. while(a[xx]!=xx){
  37. int t=a[xx];
  38. a[xx]=xx;
  39. xx=t;
  40. }
  41. }
  42. cout<<n-ans<<endl;
  43. return ;
  44. }
  1.  

[CSL 的魔法][求排序最少交换次数]的更多相关文章

  1. 使序列有序的最少交换次数(minimum swaps)

    交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...

  2. [小米OJ] 8. 最少交换次数

    求逆序对数即可 function solution(line) { var nums = line.split(","); var res = 0; for (let i = 0; ...

  3. Cycle Sort (交换次数最少的排序)

    该算法的效率并不高.但是却提供了一个很好的思路.如何让一个序列在最小交换次数下实现有序. Cycle Sort 翻译成中文是 圈排序. 这个圈在于需要交换的数据形成圈. 具体一点: 如: Array ...

  4. php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)

    php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中) 一.总结 1.if(isset($arr[$val])) $arr[$val]++; //1 ...

  5. 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 ...

  6. POJ2431贪心(最少加油次数)

    题意:        给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...

  7. [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 ...

  8. nyoj最少乘法次数——快速幂思想

    最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...

  9. LeetCode:最少移动次数使得数组元素相等||【462】

    LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最 ...

随机推荐

  1. Kaggel比赛 : [Give Me Some Credit]

    通过预测在未来两年内某人将经历财务困境的可能性,改善信用评分的状态. Description 银行在市场经济中扮演着至关重要的角色.他们决定谁可以获得融资,以及什么条件,可以做出或破坏投资决策.为了让 ...

  2. 经典排序js实现

    https://www.cnblogs.com/onepixel/articles/7674659.html

  3. Unity3D外包(u3d外包)—就找北京动点软件(我们长年承接U3D外包、Maya、3DMax项目外包)

    一.关于动点: 北京动点飞扬软件,因致力于虚拟现实技术的开发而创立,在虚拟现实开发领域有着卓越的技术和领先的思想.   我们为用户专业定制的项目,细分了多种工作流程,软件独立自主研发,编程简化用户操作 ...

  4. linux使用代理进行apt安装 以 nord 为例

    我的环境:(不必完全一样,只是提一下)----------- linux系统:kali 桌面:xface ----------------------------------------------- ...

  5. _mount_vendor

    允许NPC售卖坐骑时进行预览

  6. xml.libxml2_添加带tagname的xml文本(xmlNewTextChild)

    1. 2.例子代码: int TgText::NodeNew_G2SVG(xmlNode* _pNodeCurrent_G, xmlNode* _pNodeParent_SVG, xmlNode** ...

  7. iOS10 后 http 网页定位失效解决方案

    最近公司开发一个app项目H5+ MUI框架进行开发的,开发的相关人员离职后,我这个小菜鸟...都是泪(从未接触过app开发) 项目要嵌入百度地图,由于已经做了微信版本的,想着还是用js api 做吧 ...

  8. [JavaScript] 邮箱验证

    1.JQuery $(function(){ $("#username").blur(function(){ var temp=$("#username"); ...

  9. hive新功能cube和rollup

    1.cube简称数据魔方,可以实现hive多个任意维度的查询,cube(a,b,c)则首先会对(a,b,c)进行group by,然后依次是(a,b),(a,c),(a),(b,c),(b),(c), ...

  10. [hdu P3085] Nightmare Ⅱ

    [hdu P3085] Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...