老题新解|不与最大数相同的数字之和
《信息学奥赛一本通》第93题:不与最大数相同的数字之和
题目描述
输出一个整数数列中不与最大数相同的数字之和。
输入格式
输入分为两行:
第一行为 N(NN(NN(N 为接下来数的个数,N≤100)N \le 100)N≤100);
第二行为 NNN 个整数,数与数之间以一个空格分开,每个整数的范围是 −1000,000-1000,000−1000,000 到 1000,0001000,0001000,000。
输出格式
输出为 NNN 个数中除去最大数其余数字之和。
输入输出样例 #1
输入 #1
3
1 2 3
输出 #1
3
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 93 题:不与最大数相同的数字之和。
一、题目描述
洛谷的题号是:B2094 不与最大数相同的数字之和
二、题意分析
这道题是信息学奥赛一本通练习题的第 93 题。
根据输入格式的描述,输入有两行,第一行为 N,数据范围:N≤100N \le 100N≤100,使用 int 类型。
int N;
cin>>N;
第二行为 N 个整数,每个整数的范围:−1000,000-1000,000−1000,000 到 1000,0001000,0001000,000,使用 int 类型进行存储,元素个数为:110,for 循环对数据进行输入。
int a[110];
for(int i=1;i<=N;i++)
{cin>>a[i];
}
题目要求我们找出数列中不与最大数相同的数字之和,因此需要先找出最大数,可以设定第一个数为最大数。
int maxx=a[1];
之后从下标为 2 的数开始,访问寻找最大的数。
for(int i=2;i<=N;i++)
{if(a[i]>=maxx){maxx=a[i];//找最大值}
}
找到最大值后,我们需要取出最大数中的其余数字之和,考虑到有可能有多个和最大值相同的数,因此需要使用 for 循环来遍历,去掉最大值,即数值中不等于最大值的。
计算总和时,需要定义一个变量,并初始化为 0。
int sum=0;
for(int i=1;i<=N;i++)//切记要从下标为1开始访问
{if(a[i]!=maxx){sum+=a[i];}
}
最后输出 sum 即可。
cout<<sum;
按照样例输入对数据进行验证。
符合样例输出,到网站提交测评。
测试通过!
找最大值还有其他方法:将最大值初始化为一个很小的数,这样能确保数组中的数字能够被替换,在输入时就可以不断的更新最大值。
最后计算总和时,直接剔除最大值进行累加即可。
int maxx=-1000000;
for(int i=1;i<=N;i++)
{cin>>a[i];if(a[i]>maxx){maxx=a[i];}
}
int sum=0;
for(int i=1;i<=N;i++)
{if(a[i]!=maxx){sum+=a[i];}
}
三、完整代码
该题的完整代码如下:
代码1:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{int N;cin>>N;int a[110];for(int i=1;i<=N;i++){cin>>a[i];}int maxx=a[1];for(int i=2;i<=N;i++){if(a[i]>=maxx){maxx=a[i];//找最大值}}int sum=0;for(int i=1;i<=N;i++)//切记要从下标为1开始访问{if(a[i]!=maxx){sum+=a[i];}}cout<<sum;return 0;
}
代码2:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{int N;cin>>N;int a[110];int maxx=-1000000;for(int i=1;i<=N;i++){cin>>a[i];if(a[i]>maxx){maxx=a[i];}}int sum=0;for(int i=1;i<=N;i++){if(a[i]!=maxx){sum+=a[i];}}cout<<sum; return 0;
}
四、总结
这道题考察的知识点很基础,但也非常典型,主要涉及:
1、数组输入与存储:输入 N 个整数存入数组,注意下标从 1 还是 0 开始,写法要统一。
2、最大值查找:
有两种方式:
(1)先假设第一个数是最大值,再逐个比较更新;
(2)直接将 maxx 初始化为一个极小的数,在输入时一边更新。
(3)条件累加:题目要求的是“不与最大数相同的数字之和”,所以在遍历时要判断 a[i] != maxx
。
常见易错点:
(1)忘记考虑数组中多个最大值的情况。如果只排除一个最大值而不是所有最大值会出错。
(2)输入规模虽然只有 N≤100N \leq 100N≤100,但是数值范围可能达到 ±1,000,000,注意不要用 short。
(3)如果所有数都相同,那么最终结果应该是 0(因为没有比最大值小的数)。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~