题干:

链接: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 至少使用多少次魔法,能够达到最小化的目标。

输入描述:

第一行有一个整数 n,表示序列的长度。接下来两行,每行有 n 个整数,分别表示初始序列 a 和 b。

输入数据保证每个序列里的数两两不同。

2≤n≤1052≤n≤105
1≤ai,bi≤1091≤ai,bi≤109

输出描述:

在一行输出一个整数,表示最少使用的魔法次数。

示例1

输入

复制

2
1 2
1 2

输出

复制

1

示例2

输入

复制

2
1 2
2 1

输出

复制

0

解题报告:

首先通过贪心不难证明,当两个数组分别是最大值和最小值匹配的时候,这样刚好达到最小值。所以就是怎么通过最小步数让a数组可以从大到小排列就可以了。

那么后面这一步的实现方法就很多了。该AC代码只是提供了一种方式。还可以用离散数学中置换群的概念来理解(如果没记错应该是叫这个),大概一堆概念什么对换变换置换一类操作,,具体忘记了,总之就是可以得出一堆环来,每个环之间的数一次替换就可以排列好,也就是分成若干个块,块间不影响。。(因为你换一次操作至少能对齐一个吧,就是你换走的这个。当然如果巧合,换过来的这个刚好就是你需要的,那就完美了,对于这个块的操作就结束了)。对于上述步骤,可以利用该思想暴力,也可以直接算出这个块中有多少数字,假设涉及x个数字,然后直接(x-1)就是答案。。又因为总块数是n,那么换句话说,只需要数出有多少个块cnt,然后n-cnt就是答案。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX],b[MAX],aa[MAX],bb[MAX];
map<int,int> mp,mb;//mb存b数组每个数字的位置。  mp存本应该在的位置
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) cin>>a[i],aa[i] = a[i];for(int i = 1; i<=n; i++) cin>>b[i],mb[b[i]] = i;sort(aa+1,aa+n+1);sort(b+1,b+n+1,greater<int>());for(int i = 1; i<=n; i++) mp[aa[i]] = mb[b[i]];int ans = 0;for(int i = 1; i<=n; i++) {while(mp[a[i]]!=i) swap(a[i],a[mp[a[i]]]),ans++;}printf("%d\n",ans);return 0 ;
}

AC代码2:(分块的方法,省掉了map,跑的飞快)

#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> pii;
#define ff first
#define ss second
#define mp make_pairint main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<pii> ab(n);vector<int> next(n);vector<bool> vis(n, false);for (int i = 0; i != n; ++i) cin >> ab[i].ff;for (int i = 0; i != n; ++i) cin >> ab[i].ss;sort(ab.begin(), ab.end());for (int i = 0; i != n; ++i) ab[i].ff = i;//映射到新值1~n内sort(ab.begin(), ab.end(), [] (const pii& x, const pii& y) { return x.ss > y.ss; });for (int i = 0; i != n; ++i) next[i] = ab[i].ff;int res = 0;for (int i = 0; i != n; ++i) if (!vis[i]) {++res;while (!vis[i]) {vis[i] = true;i = next[i];}}cout << n - res << endl;
}

【牛客 - 551E】CSL 的魔法(贪心,思维,STLmap,分块)相关推荐

  1. 【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

    题干: LLLYYY很喜欢写暴力模拟贪心思维.某一天在机房,他突然抛给了队友ppq一 个问题.问题如下: 有一个函数f (): int f(int x){     int tmp = 0;     w ...

  2. 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维

    C.幸运数字Ⅲ 链接:https://www.nowcoder.com/acm/contest/70/C 来源:牛客网 这个题447和477是特殊的,其他的就没什么了. 代码: 1 #include& ...

  3. 牛客网wannafly挑战赛13-D(贪心)

    链接:https://www.nowcoder.com/acm/contest/80/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  4. 牛客 - 牛牛的最大兴趣组(思维+数论)

    题目链接:点击查看 题目大意:给出 nnn 个数,要求选出最多的数,使得任意两个数的乘积不能是三次平方数,三次平方数,诸如23=8,33=272^3=8,3^3=2723=8,33=27 题目分析:这 ...

  5. 牛客 - 牛牛的mex(主席树/思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 的 mex 题目分析:算是一道比较经典的题目了吧,先说一般做法,一般做法是 nl ...

  6. *【牛客 - 315D】打车(贪心,同优则立证明法)

    题干: 妞妞参加完Google Girl Hackathon之后,打车回到了牛家庄. 妞妞需要支付给出租车司机车费s元.妞妞身上一共有n个硬币,第i个硬币价值为p[i]元. 妞妞想选择尽量多的硬币,使 ...

  7. 动态规划--牛客网19校招--魔法深渊

    题目描述 前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极AI的研究人员,月神自然去看了此神剧. 由于太过兴奋,晚上月神做了一个奇怪的梦,月神梦见自己掉入了一个被施放了魔法的深渊,月神想要爬 ...

  8. 牛客网Chino with Expectation【思维+位运算】

    Chino的数学很差,因此Cocoa非常担心.这一天,Cocoa准备教Chino学习异或. 众所周知,,即"异或"表示了和的二进制按位异或的结果(在C/C++中,表示了异或运算.) ...

  9. 【牛客】CSL 的字符串 (stack map)

    https://ac.nowcoder.com/acm/contest/551/D 这个题怎么说,data用来存储这个字母在字符串中最后一次出现的位置,vis则用来记录该字母是否在栈中. 当栈为空的时 ...

最新文章

  1. 并发编程之多进程编程(python版)
  2. 【深度学习】19家机构联合发布,200页大模型Roadmap!
  3. 《Adobe Premiere Pro CC经典教程》——14.6 特殊颜色效果
  4. 40.Node.js Web 模块
  5. python特征选择工具_一个Python特征选择工具,助力实现高效机器学习
  6. 标题 计算机构自由度时主要步骤有哪些,2010年1月全国自考混凝土结构设计试题和答案...
  7. 不改变原数组的一些方法
  8. B站陈睿:70 后也正在爱上哔哩哔哩
  9. 常用基本控件测试用例(一)
  10. margin负值的巧妙运用(HTML、CSS)
  11. MCU——JLINk找不到芯片错误记录
  12. Mac python入门:安装python并新建python项目
  13. 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 2.7 代理模式...
  14. jQuery Mobile 移动开发中的日期插件Mobiscroll使用说明
  15. 解决办法:Eclipse卡死在“revert resources”,进度一直为0
  16. java 生成uuid
  17. 【HamonyOS嵌入式】BearPi-HM_Nano控制DS18B20温度传感器(注释版)
  18. 微信小程序优惠券制作方法
  19. 字号与文字的大小关系
  20. Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available,and.

热门文章

  1. 美国团购网站Groupon的盈利模式
  2. Java集合容器面试题
  3. [leedcode][JAVA][365][BFS]
  4. HDOJ-1257 最少拦截系统
  5. 旅馆客未满 计算机术语,前厅测试题
  6. python多线程编程_Python 多线程编程
  7. mac mysql安装失败_Mac mysql安装失败解决方法
  8. webdav 软件_6 款功能强大的工具软件,有一款人人必备
  9. 1476D. Journey
  10. tx2无法识别网络_Jetson TX2开篇--网络配置