CF2041M.Selection Sort

普及+/提高

通过率:0%

AC君温馨提醒

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

题目描述

每个选修算法课程的学生本周都需要提交一次作业。任务是实现一个 O(n2)O(n^2) 时间复杂度的算法,将给定的 nn 个整数按非递减顺序排序。Alice 已经完成了她的作业,她的实现如下所示:

int alice_sort(int *s, int n){
  for(int i = 0; i < n; ++i){
    for(int j = i + 1; j < n; ++j){
      if(s[i] > s[j]){
        int swap = s[i];
        s[i] = s[j];
        s[j] = swap;
      }
    }
  }
  return 0;
}

虽然你可以访问到 Alice 的代码,但你并不想直接照搬。你希望将 Alice 的排序函数作为你自己解决方案的一个构建模块。你可以通过以下两种方式使用她的函数,但每种方式最多只能使用一次。这两种操作的调用顺序可以任意。

  • 前缀排序:选择一个长度 i∈{1,2,…,n}i \in \{1, 2, \ldots, n\},调用 alicesort(s,i)\texttt{alicesort(}s, i\texttt{)}。这会将数组 ss 的前 ii 个元素排序。
  • 后缀排序:选择一个长度 i∈{1,2,…,n}i \in \{1, 2, \ldots, n\},调用 alicesort(s+n−i,i)\texttt{alicesort(}s+n-i, i\texttt{)}。这会将数组 ss 的后 ii 个元素排序。

由于排序算法的时间复杂度,执行一次前缀或后缀排序的代价为 i2i^2,其中 ii 是所选子数组的长度。你的目标是,按照上述规则,使用 Alice 的函数对输入数组 ss 的 nn 个整数进行非递减排序,并求出最小的总代价。

例如,设 s=[3,2,5,5,4,1]s=[3,2,5,5,4,1]。我们可以先对长度为 44 的后缀排序,数组变为 [3,2,1,4,5,5][3,2,1,4,5,5]。然后对长度为 33 的前缀排序,数组变为 [1,2,3,4,5,5][1,2,3,4,5,5],此时数组已排序。总代价为 42+32=254^2+3^2=25。再如,设 s=[4,3,2,1]s=[4,3,2,1],只需对长度为 44 的前缀排序即可完成排序,总代价为 42=164^2=16。

输入格式

第一行包含一个整数 nn,表示数组 ss 的元素个数。第二行包含 nn 个整数,表示 s=[s0,s1,…,sn−1]s=[s_0, s_1, \ldots, s_{n-1}]。

  • 1≤n≤1061 \le n \le 10^6
  • 对所有 ii(0≤i<n0\le i < n),有 0≤si<231−10\le s_i < 2^{31}-1。

输出格式

输出一行一个整数,表示按照上述规则,使用 Alice 的函数将输入数组 ss 排序所需的最小总代价。

输入输出样例

  • 输入#1

    6
    3 2 5 5 4 1

    输出#1

    25
  • 输入#2

    4
    4 3 2 1

    输出#2

    16

说明/提示

由 ChatGPT 4.1 翻译

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

首页