【C++】排序算法/正则序列

[编程题]正则序列
时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序

有一天小团得到了一个长度为n的任意序列s,他需要在有限次操作内,将这个序列变成一个正则序列,每次操作他可以任选序列中的一个数字,并将该数字加一或者减一。

请问他最少用多少次操作可以把这个序列变成正则序列?

数据范围:,
进阶:时间复杂度,空间复杂度

输入描述:
输入第一行仅包含一个正整数n,表示任意序列的长度。(1<=n<=20000)

输入第二行包含n个整数,表示给出的序列,每个数的绝对值都小于10000。

输出描述:
输出仅包含一个整数,表示最少的操作数量。

输入例子1:
5
-1 2 3 10 100

输出例子1:
103

#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv){
    int n;
    cin>>n;
    int a[n];
    for(int i = 0 ; i < n; i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int count = 0;
    for(int i = 1; i <= n; i++){
        count = count + abs(a[i-1] - i);
    }
    cout<<count<<endl;
    return 0;
}
您的代码已保存
通过全部用例
运行时间
7ms
占用内存
412KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值