问题描述
解题思路
数组B的性质
显然,用于表示数组
A
A
A前缀最大值的数组
B
B
B是单调不降
的:
0
≤
B
1
≤
B
2
≤
⋅
⋅
⋅
≤
B
n
≤
1
0
5
0\le B_1 \le B_2 \le ··· \le B_n \le 10^5
0≤B1≤B2≤⋅⋅⋅≤Bn≤105
sum的最大值
要使得数组A中值的和最大
,那就只要让
A
i
(
1
≤
i
≤
n
)
A_i(1\le i \le n)
Ai(1≤i≤n)等于
m
a
x
{
B
1
,
B
2
,
⋅
⋅
⋅
,
B
i
}
max\{B_1,B_2,···,B_i\}
max{B1,B2,⋅⋅⋅,Bi}。而数组
B
B
B是单调不降的,只需要让
A
i
A_i
Ai等于
B
i
B_i
Bi,数组A中值的和就是最大的。
sum的最小值
A
A
A是由自然数
组成的数组,
A
i
A_i
Ai的最小值是0。要使得数组A中值的和最小
,那就需要让
A
1
,
A
2
,
⋅
⋅
⋅
,
A
i
A_1,A_2,···,A_i
A1,A2,⋅⋅⋅,Ai满足前缀最大值
B
1
,
B
2
,
⋅
⋅
⋅
,
B
i
B_1,B_2,···,B_i
B1,B2,⋅⋅⋅,Bi的基础上,往可变的区域填0
。
B_1
只表示了A_1
,所以A_1
等于B_1
。- 对于 i > = 2 i>=2 i>=2,如果 B i − 1 B_{i-1} Bi−1等于 B i B_{i} Bi,说明 A A A中前 i i i个数的最大值与 A A A中前 i − 1 i-1 i−1个数的最大值相等。那 A i A_i Ai为 0 0 0符合前缀最大值。
- 对于 i > = 2 i>=2 i>=2,如果 B i − 1 B_{i-1} Bi−1不等于 B i B_{i} Bi,说明 A A A中前 i i i个数的最大值与 A A A中前 i − 1 i-1 i−1个数的最大值不相等。那 A i A_i Ai就得是 A A A中前 i i i个数中的最大值,即 A i A_i Ai等于 B i B_i Bi。
AC代码
注:程序里用了C++11的特性,编译环境
应该选择“Dev-CPP (C++语言C++11标准)
”或者“Dev-CPP (C++语言C++14标准)
”。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> B(n);
for (int& A_i : B)
{
cin >> A_i;
}
int maxSum = 0, minSum = 0;
for (int i = 0; i < n; ++i)
{
maxSum += B[i];
if (i == 0)
{
minSum += B[0];
}
else if (B[i - 1] < B[i])
{
minSum += B[i];
}
}
cout << maxSum << endl << minSum << endl;
return 0;
}