0
点赞
收藏
分享

微信扫一扫

CCF计算机软件能力认证202109-1数组推导(C语言版)

在觉 2022-02-10 阅读 40

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;
}
举报

相关推荐

0 条评论