CSP 202109-1 数组推导(详细分析)

题目分析:

(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 加上这个数。
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值