#include<iostream>usingnamespace std;intmain(){longlong n, N, sum =0;
cin >> n >> N;longlong r = N /(n +1);longlong* A =newlonglong[n +1];
A[0]=0;for(int i =1; i <= n; i++)
cin >> A[i];// 初始化fx,gxint ii =1;for(int i =0; i < N; i++){if(i == A[ii]) ii++;// abs((ii - 1) - (i / r)): |f(x) - g(x)|
sum +=abs((ii -1)-(i / r));}
cout << sum;delete[] A;return0;}
【100分思路】
【优化思路】结合第一问的提示,针对划分出的区间直接求解,似乎为该题的可行思路。
f(x):求其在某个区间的和,可以直接借鉴第一题方法。在
x
∈
[
A
[
i
−
1
]
,
A
[
I
]
)
x \in [A[i-1],A[I])
x∈[A[i−1],A[I]) 时,所有的 f(x) 都为
i
−
1
i - 1
i−1。
#include<iostream>#include<algorithm>usingnamespace std;intmain(){int n, N, len, MAX =-1, A[100010]={};// MAX 仍与当前 g 相等的最大 j 值longlong errorA =0;
cin >> n >> N;for(int i =1; i <= n; i++){
cin >> A[i];}
A[n +1]= N;int r = N /(n +1);for(int i =1; i <= n +1; i++){for(int j = A[i -1]; j < A[i]; j += len){int g = j / r;// j = x // (g + 1) * r - 1 是 MAX 可能的最大值,确保不超过当前区间的边界if((g +1)* r -1< A[i]){
MAX =(g +1)* r -1;}else{
MAX = A[i]-1;}
len = MAX - j +1;
errorA +=(abs(i -1- g))* len;// f(x) = i - 1}}
cout << errorA;return0;}