题目链接
开始时取
b
[
i
]
=
a
[
i
]
(
1
<
=
i
<
=
n
)
b[i] = a[i](1 <= i <= n)
b[i]=a[i](1<=i<=n)
若存在
i
i
i使
b
[
i
]
<
>
M
i
d
(
b
[
i
−
1
]
,
a
[
i
]
,
b
[
i
+
1
]
)
(
2
<
=
i
<
=
n
−
1
)
b[i] <> Mid(b[i - 1], a[i], b[i + 1]) (2 <= i <= n - 1)
b[i]<>Mid(b[i−1],a[i],b[i+1])(2<=i<=n−1)
{
M
i
d
(
x
,
y
,
z
)
Mid(x, y, z)
Mid(x,y,z)表示
x
,
y
,
z
x, y, z
x,y,z中数值居中间的数}
则
b
[
i
]
=
M
i
d
(
b
[
i
−
1
]
,
a
[
i
]
,
b
[
i
+
1
]
)
b[i]=Mid(b[i - 1], a[i], b[i + 1])
b[i]=Mid(b[i−1],a[i],b[i+1])
直到没有以上所说的
i
i
i
所得的
b
b
b数列即为所求
按公式求V
输出
#define ll long long
#define vec vector<int>
#define P pair<int,int>
#define inf 0x3f3f3f3f
#define MAX 205
int N, a[MAX], b[MAX], arr[3];
int mid(int x, int y, int z) {
arr[0] = x, arr[1] = y, arr[2] = z;
sort(arr, arr + 3);
return arr[1];
}
int main() {
while (scanf("%d", &N) != EOF) {
for (int i = 1; i <= N; i++)
scanf("%d", &a[i]), b[i] = a[i];
int sign = 1;
while (1) {
sign = 0;
for (int i = 2; i < N; i++) {
int tt = mid(b[i - 1], a[i], b[i + 1]);
if (b[i] == tt)continue;
else b[i] = tt, sign = 1;
}
if (!sign)break;
}
int res = abs(double(a[N] - b[N]));
for (int i = 1; i < N; i++) {
res += abs(double(a[i] - b[i]));
res += abs(double(b[i] - b[i + 1]));
}
cout << res << endl;
}
}