#include<bits/stdc++.h>
using namespace std;
int n,N,r;
long long a[1000100],b[1000000];
long long err;
int main() {
cin >> n >> N;
r = N/(n+1);
int m =(N +r-1)/r;//b的size
a[0] = 0,b[0] = 0;
for(int i =1;i <= n; ++i) {
cin >> a[i];
}
for(int i = n +1; i <= m-1; ++i) {
a[i] = N;
}
for(int i =1; i<= m-1;++i) {
b[i] = r*i;
}
for(int i = 1; i<= m-1; ++i) {
err += abs(a[i]-b[i]);
}
cout<<err<<endl;
return 0;
}
代码如上,思路如下
将整个过程想象为一个铺砖的过程,a[i]=j就代表在第i行第j列到N-1列铺砖,则目标是求出与标准的铺砖的差异,及可以在每一层铺砖的过程中记录即可。重点在与b数组与a数组边界的处理,b数组的大小可能远比a数组要大,大出来的a[i]定义为N即可。