单点时限: 2.0 sec
内存限制: 256 MB
有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限蝌蚪的袋子,可以往一个水缸里放入一只蝌蚪,也可以取出一只蝌蚪,求最少的操作数,使得每个水缸的蝌蚪数量形成一个公差为 k 等差数列。
输入格式
第一行一个数 n,k(3⩽n⩽3×,0⩽k⩽
)。
第二行 n 个数,表示每个水缸里的蝌蚪数目(0⩽⩽
)。
输出格式
输出最少操作次数。
样例
input
4 2 1 2 3 4
output
4
input
4 2 0 1 2 3
output
6
#include <bits/stdc++.h>
#define int long long
const int N=1e5;
using namespace std;
int sa[3*N+10];
signed main()
{
int n,k,a,A,q=0,w=0;
cin >> n >> k;
cin >> a;
A=a;//假设第一个数不变
//sa[0]=0;与第一个数差为0
for(int i = 1 ; i < n ; i++){
int b;
cin >> b;
A+=k;
sa[i]=-(b-A);
//记录下与应得的数的差值
}
sort(sa,sa+n);
int sum=0;
int x=min(a,sa[n/2]);
//修正最大值
//a防止负数,sa差值中位数
for(int i = 0;i < n;i++){
sum+=abs(sa[i]-x);
}
cout << sum <<endl;
return 0;
}