CSP202109-1数组推导
题目:
思路:
很简单,因为A数组中的数是自然数(非负整数),所以B数组中的值是单调不递减的,也就是从B数组下标为1开始,要么要么等于前面的值,要么大于前面的值。
如果B数组一直是递增的,那么证明B数组中的值=A数组中的值,只有这样,B数组才可能一直递增。
这样A数组中值就固定了,就是等于B数组,所以最大和、最小和都是B数组的和。
如果B数组中出现有等于前面一项的情况,那么最大和也是B数组。
算最小和的话,B数组中该项等于前一项,那么为了使和最小,该项就是0。
具体方法就是:算这个的话,需要设置一个标记f,f初始化为B数组的第0项,当B数组中出现比f更大的数时,替换f,然后设定A数组中此项为f的值;没有出现时,此项为0即可。这样可以保证最小和。
注意点:
思路很简单,注意一下输入输出格式,输入格式中需要先输入数组的大小,然后再一行输入B数组的值,中间用空格隔开。这个在C语言中比较恶心,C语言中不能根据n去动态初始化数组,这个就需要用到malloc函数了,动态开辟n大小的空间。然后一行输入数据的话,用scanf先接收到m变量中。然后再赋值到B数组中,getchar吸收一行中的空格这类字符,然后最后回车时跳出循环,OK。
上代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int* B;
B=(int*)malloc(sizeof(int)*n);
int m;
char c;
for(int i=0;i<n;i++)
{
scanf("%d",&m);
B[i]=m;
c=getchar();
if(c=='\n')
{
break;
}
}
int SumMax=0;
for(int i=0;i<n;i++)
{
SumMax+=B[i];
}
int f=B[0];
int SumMin=f;
for(int i=1;i<n;i++)
{
if(B[i]==f)
{
SumMin+=0;
}
if(B[i]>f)
{
f=B[i];
SumMin+=f;
}
}
printf("%d\n",SumMax);
printf("%d\n",SumMin);
return 0;
}
|