AT_joi2013ho5.バブルソート (Bubble Sort)

省选/NOI-

通过率:0%

AC君温馨提醒

该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

冒泡排序是一种对序列进行排序的算法之一。假设要将长度为 NN 的数列 AA 按升序排序。冒泡排序会检查相邻的两个数,如果它们的大小关系不正确,则交换它们的位置。这一操作会从数列的前端依次进行。也就是说,对于 i=1,2,…,N−1i = 1, 2, \ldots, N-1,如果 Ai>Ai+1A_i > A_{i+1},就交换这两个数,这样的一次遍历称为一次扫描。已知重复进行 N−1N-1 次扫描后,可以将数列按升序排序。

数列 AA 通过冒泡排序进行交换的次数,指的是将上述算法应用于数列 AA 时,整数之间发生交换的总次数。(虽然冒泡排序的算法和实现在循环顺序、范围以及终止条件等细节上可能有所不同,但已知对同一个数列应用时,整数交换的总次数不会因这些差异而改变。)

例如,以下程序是用 C 语言编写的函数,用冒泡排序对长度为 n 的整数数组 a 进行排序。

void bubble_sort(int *a, int n) {
  int i, j;
  for (i = 0; i < n - 1; ++i) {
    for (j = 0; j < n - 1; ++j) {
      if (a[j] > a[j + 1]) {
        /* 以下 3 行相当于一次整数的交换 */
        int x = a[j];
        a[j] = a[j + 1];
        a[j + 1] = x;
      }
    }
  }
}

输入格式

从标准输入读取以下数据。

  • 第 11 行包含一个整数 NN,表示数列 AA 的长度。
  • 接下来的 NN 行中,第 ii 行包含一个整数 AiA_i,表示数列 AA 的第 ii 个整数。

输出格式

请输出一个整数,表示通过冒泡排序对数列 A′A' 进行排序时的最小交换次数,其中 A′A' 是将数列 AA 中任意两个整数交换一次后得到的新数列。输出结果占一行。

输入输出样例

  • 输入#1

    5
    10
    3
    6
    8
    1

    输出#1

    0
  • 输入#2

    5
    3
    1
    7
    9
    5

    输出#2

    2
  • 输入#3

    3
    1
    2
    3

    输出#3

    1

说明/提示

任务

给定一个长度为 NN 的数列 AA。你可以将数列 AA 中任意两个位置的整数交换一次,得到数列 A′A'。请编写程序,求出数列 A′A' 通过冒泡排序进行排序时所需的最小交换次数。(注意,最初交换的两个整数不一定是相邻的。)

限制

2≤N≤100 0002 \leq N \leq 100\,000
1≤Ai≤1 000 000 0001 \leq A_i \leq 1\,000\,000\,000
(注:移植自旧题时对限制进行了修正。)


评测标准

对于评测数据中 10%10\% 的数据,满足 N≤1 000N \leq 1\,000,且任意 i,ji, j (1≤i<j≤N1 \leq i < j \leq N) 满足 Ai≠AjA_i \neq A_j。

对于评测数据中 30%30\% 的数据,满足 N≤5 000N \leq 5\,000,且任意 i,ji, j (1≤i<j≤N1 \leq i < j \leq N) 满足 Ai≠AjA_i \neq A_j。

对于评测数据中 80%80\% 的数据,任意 i,ji, j (1≤i<j≤N1 \leq i < j \leq N) 满足 Ai≠AjA_i \neq A_j。


样例解释 1

如果将数列 AA 的第一个 1010 和最后一个 11 交换,则数列 A′A' 就变成了已排序的序列,此时冒泡排序的交换次数为 00。


样例解释 2

如果将数列 AA 的第 33 个 77 和最后一个 55 交换,则数列 A′A' 变为 3,1,5,9,73, 1, 5, 9, 7。此时 A′A' 通过冒泡排序的交换次数为 22。


样例解释 3

即使最初数列 AA 已经是有序的,在构造数列 A′A' 时也必须进行一次交换。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页