ccf-csp计算机软件能力认证202109-1数组推导(C语言版)
题目内容:
问题描述
输入格式
从标准输入读入数据。
输入的第一行包含一个正整数 n 。
输入的第二行包含 n 个用空格分隔的自然数 B1,B2,⋯,Bn。
输出格式
输出到标准输出。
输出共两行。
第一行输出一个整数,表示 sum 的最大值。
第二行输出一个整数,表示 sum 的最小值。
样例1输入
6
0 0 5 5 10 10
样例1输出
30
15
样例1解释
数组A的可能取值包括但不限于以下三种情况。
情况一:A = [ 0 , 0 , 5 , 5 , 10 , 10 ]
情况二:A = [ 0 , 0 , 5 , 3 , 10 , 4 ]
情况三:A = [ 0 , 0 , 5 , 0 , 10 , 0 ]
其中第一种情况 sum = 30 为最大值,第三种情况 sum = 15 为最小值。
样例2输入
7
10 20 30 40 50 60 75
样例2输出
285
285
样例2解释
A = [ 10 , 20 , 30 , 40 , 50 , 60 , 75 ] 是唯一可能的取值,所以 sum 的最大、最小值均为 285。
子任务
解题思路
1.第一步把数据存入电脑,这道题目显然采用先存后用或是边存边用都是可以的,这里给出的解答用的是先存后用的方式,初学者可以尝试将其改为边存边用的方式,即对每一个将要存入的数据进行全部运算后继续读取下一数据。
2.第二步思考题目,简化后就可以很简单的理解为,假设一个数 x 为 0 ,则从该数组第一个数开始:
若该数大于 x ,假设第一个数为 10 ,则原数组第一个数字一定为 10 ,所以该组数的最大值和最小值都需要加 10 ,由于后续比较我们是和 10 比,我们可以把 x 设为 10 存起来,方便后续比较。
然后,现在 x=10,假设第二个数小于等于 10,则第二个数在 0-10 之间随便取都不会影响数列,那显然最大可以取到 10 ,最小可以取 0 ,那么最大值就是+x,最小值不变即可。
3.综上分析,我们一共会用到三个变量,max,min,now,now即为上述分析中的 x ,现在需要比较的值。然后就是依次比较下一个数和当前数的大小,通过循环即可得出答案。
提交后得100分的C语言程序如下:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int i,s[n];
//存取数据
for(i=0;i<n;i++) scanf("%d",&s[i]);
//进行计算
int now=s[0],max=s[0],min=s[0];
for(i=1;i<n;i++){
if(s[i]>now) {now=s[i];max+=now;min+=now;}
else if(s[i]<=now) {max+=now;}
//printf("max=%d,min=%d\n",max,min);此行代码用于数据测试
}
printf("%d\n%d",max,min);
return 0;
}