第25次CCF计算机软件能力认证第二题
题目链接
http://118.190.20.162/view.page?gpid=T137
解决代码
#include<iostream>
#include<vector>
using namespace std;
const int M = 10001;
int r;
int n, N;
#define real(a) a
long function(const int a1, const int a2, const int i){// a1 a[i] a2 a[i-1] i为a2的索引
long result = 0;
int g;
if(a1/r != a2/r){
g = a2/r + 1;
result += (g*r - a2) * abs(real(g-1)-i);
while(g < a1/r){
result += r * abs(real(g)-i);
++g;
}
result += (a1-g*r) * abs(real(g)-i);
}else{
g = a1/r;
result += (a1 - a2) * abs(real(g)-i);
}
return result;
}
int main(){
long long ans = 0;
vector<int> a;
a.reserve(M);
cin >> n >> N;
r = N / (n + 1);
a.push_back(0);
for(int i = 1; i <=n; i ++){
int tmp;
cin >> tmp;
a.push_back(tmp);
ans += function(a[i], a[i-1], i-1);
}
ans += function(N, a[n], n);
// 由于整体采用左闭右开的方式,所以最后一个数要进行处理
cout << ans;
return 0;
}