#CF2041M. 选择排序
选择排序
M. 选择排序
时间限制:每个测试点 2 秒
内存限制:每个测试点 1024 MB
题目描述
选算法课的学生这周都要提交一份作业。任务是实现一个时间复杂度为 的算法,将给定的 个整数按非递减顺序排序。
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 的代码,但不想直接抄袭。而是想用她的排序函数作为自己方案的基础模块。
你可以用以下两种方式利用她的函数,每种操作最多使用一次,且两种操作的调用顺序任意:
- 前缀排序:选择一个长度 ,调用
alicesort(s, i)。这会将数组s的前 个元素排序。 - 后缀排序:选择一个长度 ,调用
alicesort(s + n - i, i)。这会将数组s的后 个元素排序。
由于该排序算法的时间复杂度,执行一次前缀或后缀排序的开销为 ,其中 是所选子数组的长度。
你的目标:在遵循上述规则的前提下,使用 Alice 的函数将输入的数组 (包含 个整数)排序成非递减顺序,并找出最小的总开销。
举例
例 1
输入:
操作步骤:
- 先做一次长度为 的后缀排序,数组变为
- 再做一次长度为 的前缀排序,数组变为
总开销:
例 2
输入:
操作步骤:
只做一次长度为 的前缀排序即可。
总开销:
输入格式
第一行一个整数 ,表示数组元素个数。
第二行 个整数,表示数组 。
数据范围:
输出格式
输出一个整数,表示将输入数组 排成非递减顺序的最小总开销。
示例
样例 1
输入:
6
3 2 5 5 4 1
输出:
25
样例 2
输入:
4
4 3 2 1
输出:
16