上海市计算机学会竞赛平台2022年4月月赛丙组步步高
题目描述
给定一个序列 a1,…,ana1,…,an ,小爱可以修改这个序列,每步修改只能修改一个数字,且只能将这个数字增加一个单位或减少一个单位。
请问,最少需要几步修改,才能将序列调整成一个步步高序列。所谓步步高序列,就是指每一个数字恰好比前一个数大 11。
输入格式
- 第一行:单个整数 nn,表示数列长度;
- 第二行:nn 个整数,表示 a1,…,ana1,…,an。
输出格式
- 单个整数:表示最小的修改步数。
数据范围
- 对于 30%30% 的数据,1≤n≤201≤n≤20,1≤ai≤201≤ai≤20;
- 对于 60%60% 的数据,1≤n≤50001≤n≤5000,1≤ai≤50001≤ai≤5000;
- 对于 100%100% 的数据,1≤n≤5000001≤n≤500000,−109≤ai≤109−109≤ai≤109
样例数据
输入:
5
2 3 3 3 3
输出:
5
说明:
改成1 2 3 4 5
输入:
5
-3 3 0 2 4
输出:
7
说明:
改成-1 0 1 2 3
详见代码:
#include <bits/stdc++.h>
using namespace std;
int a[500005];
int main()
{int n;long long ans = 0;cin >> n;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);a[i] -= i;}sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) {ans += abs(a[i] - a[(n + 1) / 2]);}cout << ans << endl;return 0;
}