【问题描述】

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度。每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

【样例输入1】


    2 3 1 4 
    3 2 1 4

【样例输出1】

1

【样例输入2】


    1 3 4 2 
    1 7 2 4

【样例输出2】

2

【解题思路】

本题为NOIP2013提高组day1第二题,初看这道题目,天啊,好难!又要移动两个序列,又要找最小步数。其实仔细研究一下,会发现一点也不难。

首先,不需要移动两个序列,移动一个序列是等价的(最终结果相同),因此,我们只需移动一个序列。

其次,本题的解法是非常简单的,我们可以确定,要使两个队列的距离最小,那么需要两个队列每一个位置上的高度差最小,因此,我们只需要把两个序列的高度排列的顺序换到相同就行了。我们来研究一下样例1:

样例一中2、3、1、4从小到大排列后变成了1、2、3、4,1、2、3、4在序列中所对应的序号为3、1、2、4,因此,根据我们刚才得出的解法,只要把序列二的从小到大的排列放在3、1、2、4的位置上就行了。现在我们将序列二从小到大排列,变成了1、2、3、4,在序列二中所对应的序号为3、2、1、4,我们新建一个序列三,设序列三为c,c[i]表示在序列二中序号为i的数需要放在第c[i]个,因此,序列三为2、1、3、4,即对于第x个数,它在序列二所对的序号为i,在序列一中的序号为c[i],这样,c数组就出来了,剩下的事情就是求逆序对个数了,注意边求边取模即可。

【代码实现】

 1 type rec=record
 2      xh,data:longint;
 3 end;
 4      arr=array[0..100010] of rec;
 5 var a,b:arr;
 6     c,t:array[0..100010] of longint;
 7     ans,i,j,n,min,minj,y:longint;
 8 procedure sort(l,r:longint;var a:arr);
 9       var
10          i,j,x:longint;
11          y:rec;
12       begin
13          i:=l;
14          j:=r;
15          x:=a[(l+r) div 2].data;
16          repeat
17            while a[i].data<x do
18             inc(i);
19            while x<a[j].data do
20             dec(j);
21            if not(i>j) then
22              begin
23                 y:=a[i];
24                 a[i]:=a[j];
25                 a[j]:=y;
26                 inc(i);
27                 j:=j-1;
28              end;
29          until i>j;
30          if l<j then
31            sort(l,j,a);
32          if i<r then
33            sort(i,r,a);
34       end;
35 procedure gb(l,r:longint);
36 var i,j,p,mid:longint;
37 begin
38  if l=r then exit;
39  mid:=(l+r)div 2;
40  gb(l,mid);
41  gb(mid+1,r);
42  i:=l;p:=l;j:=mid+1;
43  while(i<=mid)and(j<=r)do
44   if c[i]<=c[j] then
45    begin
46     t[p]:=c[i];inc(p);inc(i);
47    end
48   else
49    begin
50     ans:=(ans+mid-i+1)mod 99999997;t[p]:=c[j];inc(p);inc(j);
51    end;
52  while i<=mid do
53   begin
54    t[p]:=c[i];inc(p);inc(i);
55   end;
56  while j<=r do
57   begin
58    t[p]:=c[j];inc(p);inc(j);
59   end;
60  for i:=l to r do
61   c[i]:=t[i];
62 end;
63 begin
64  readln(n);
65  for i:=1 to n do
66   begin
67    read(a[i].data);
68    a[i].xh:=i;
69   end;
70  for i:=1 to n do
71   begin
72    read(b[i].data);
73    b[i].xh:=i;
74   end;
75  sort(1,n,a);
76  sort(1,n,b);
77  for i:=1 to n do
78   c[b[i].xh]:=a[i].xh;
79  gb(1,n);
80  writeln(ans);
81 end.

转载于:https://www.cnblogs.com/PengBoLiuXu/p/4536232.html

火柴排队(codevs 3286)题解相关推荐

  1. P1966 火柴排队题解

    P1966 火柴排队 题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai​−bi ...

  2. NOIP2013 火柴排队 [洛谷P1966]

    NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...

  3. 洛谷 1966 loj 2069 火柴排队 题解

    博客观赏效果更佳 题意简述 给定两个数列 a , b a,b a,b,长度均为 n ( < = 100000 ) n(<=100000) n(<=100000), a , b a,b ...

  4. 刷题总结——火柴排队(NOIP2013)

    题目: 题目背景 NOIP2013 提高组 Day1 试题 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间 ...

  5. luogu1966 火柴排队

    题目大意 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: $\sum_{i=1}^n(a_i-b_i) ...

  6. 水题 逆序对 NOIP 2013 火柴排队

    题目如下 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 a ...

  7. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

  8. 洛谷P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:\sum (a_i-b_i)^2∑(a ...

  9. 火柴排队(离散化案例+数学推导)

    题目描述 涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:\sum (a_i-b_i)^2∑(a ...

最新文章

  1. 使用OpenCV和Python生成视频条形码
  2. 京东 | AI人才联合培养计划!
  3. 实测DB_BLOCK_CHECKSUM=FULL的作用
  4. AMD CPU 看清楚
  5. python编码-python中处理中文编码问题
  6. com.esri.android,解决ArcGIS Android Could not find class 'com.esri.android.map.MapView'问题
  7. oracle库锁表处理,oracle 数据库锁表处理 ORA-00031
  8. java代码传中文参数乱码
  9. Linux静态路由相关
  10. php 7 xhprof,php7中使用xhprof解析
  11. 如何使用手机端、ipad端来编写博客
  12. 如何成为一名卓越的数据科学家——开篇七剑
  13. 初学者Pytorch 和 Caffe 使用对比
  14. 菜鸟教程网oracle,Oracle数据库入门教程 Oracle数据库菜鸟教程
  15. 手机APP测试主要有哪些内容
  16. HTML5,不只是看上去很美(可交互地铁线路图)
  17. 在deepin 上安装佳能MF 4700打印机驱动
  18. C++中的有些析构函数也被定义为virtual虚函数,这是为什么?
  19. 带农历和法定节假日的 日历控件_带节日和农历的js日历
  20. 前段时间的世界互联网大会

热门文章

  1. 当下的互联网时代,“急功近利”不是坏事
  2. 你真的会发朋友圈吗?
  3. 查理.芒格,谈投资的秘密
  4. 最近和一个创业中的朋友喝茶聊天
  5. 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
  6. go使用redis——redigo使用HMSET存储结构体
  7. sql高级语法之IF、IFNULL
  8. queue的常见用法
  9. java中的getnumber怎么用_java安全编码指南之:Number操作详解
  10. 求抛物线和直线交点_关于抛物线大题的参考经验(5):浙江历年学考题回顾...