题目分析:
(1)首先,说假设有一个数组 A,这个数组A里面全是任意的非负整数,共有n个这样的数,A1,A2,A3、、、、An。
(2)然后, 我们自己定义一个数组 B,这个数组里面也是数,但是呢,这个数组 B 中的第1个数字是数组 A 里面前 1 个数字中的最大的那个数(其实就是A1),数组 B 中的第 2 个数是 数组 A 里面前 2 个数字中的 最大的那个数(那这个时候就要把前两个数做比较了),以此类推,数组 B 中第 i 个数就是数组 A 中前 i 个数中最大的那个数。
(3) 最后重点来了,说我们现在不知道数组 A ,我们知道的是数组 B,让我们来反推数组 A。稍微思考一下数组 B 的定义,我们就会发现,数组 B 里的元素只能是单调不降的,说人话就是,数组 B 里面的数字,跟前一个数字相比,只能是要么不变,要么增大。
例如:
A = { 1,2,5,3,4,6,7,8}
那么,根据 B 的定义可知:
B = {1,2,5,5,5,6,7,8}
(4)那么我们现在假设只知道数组 B 呢:
假设数组:
B = {1,2,5,5,5,6,7,8}
- 那么,我们很容易就知道,数组 A 的取值肯定不唯一:
首先,
A = {1,2,5,3,4,6,7,8} 肯定是可以的
其次,
A = {1,2,5,0,0,6,7,8} 也是可以的
A = {1,2,5,1,1,6,7,8} 也是可以的
、、、、、
- 发现规律了吗,我们刚刚说,数组 B 里的数字是单调不降的,要么不变,要么增大。当增大时,说明数组 A 中出现了增大的这个值;不变时,说明数组 A 中同样位置没有出现比不变的这个数字更大的。
解题思路:
(1)现在我们已经知道数组 A 的情况了,让我们求数组 A 里的所有数字的和 sum 还不是有手就行吗,既然 A 是不唯一的,那么自然有一个 sum 的最大值 Smax,和一个 sum 的最小值 Smin。
(2)很明显,Smax就是当数组 A 等于 B 的时候(数组A每个数字都是最顶配);Smin就是当数组 B 里面的值不变的时候,我们就让 A 数组同样的位置最低配,根据 数组 A 的定义,最低配自然就是0了。
(3)代码实现的时候,我们只需要遍历一下数组 B 根据第(2)条来找到 数组 A 同样位置的最大值和最小值不久 OK了吗,再求数组 A 的和,题目完成。
代码实现:
#include <stdio.h>
int main()
{
int Smax = 0;
int Smin = 0;
int B[101]; //用来存放每一个数字
B[0] = 0;
int i;
int n;
scanf("%d", &n);
for(i=1; i<=n; i++) //为什么要从下标1开始,因为我们需要后进数组的数字和前一个数字比较
//如果从0开始,那B[0]就需要特判,所以我们从1开始可以使判断方式统一
{
scanf("%d", &B[i]);
Smax = Smax + B[i]; //最大值就是把所有值加起来
}
for(i=1; i<=n; i++)
{
if(B[i]>B[i-1]) Smin = Smin + B[i]; //如果出现一个比现有数组里的数字更大的,就加上这个数字
//言外之意,如果数字大小没有变大,那我们就视作是0,值不变
}
printf("%d\n%d", Smax, Smin);
return 0;
}
- 当然,其实不用数组也可以:
- 我们只要用一个变量记住上一个数的值,到下一个数时,我们先跟上一个数比较大小,没变的话,我们就把 Smin 加上0,其实就是不变,如果变大了的话,我们就把 Smin 加上这个数。