真的很简单,亿学就会
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
输入描述
输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
输出描述
输出共一行,包含一个整数,表示测验题答案。
用例输入 1
4 1 2 3 4
用例输出 1
2
题目分析
题解思路
题意简述
给定一个正整数集合,要求找出集合中有多少个数恰好等于集合中另外两个不同的数之和。
题目分析
-
数据结构选择:
- 使用一个数组 a[ ] 来存储输入的正整数,这样可以方便地进行去重和快速查找。
- 使用一个数组 z[ ] 来存储已经找到的和,以避免重复计算。
-
算法思路:
- 遍历集合中的每一个数,对于每一个数,再遍历集合中的其他数,计算它们的和。
- 如果这个和在集合中存在,并且没有被标记过,则将数组 z[ k ] 标记 ,并增加计数器(sum)。
- 最后输出计数器(sum)的值。
-
时间复杂度 : 整体时间复杂度为 O(n^3),其中 n 是集合中元素的个数。(复杂度可能不对....)
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[100001],z[100001],sum=0;
//输入
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)//第一个数
{
for(int j=i+1;j<=n;j++)//第二个数
{
for(int k=1;k<=n;k++) //查找集合
{
if(k!=i&&k!=j&&a[i]+a[j]==a[k]&&z[k]==0)
//和k不能等于加数i, j,并且没有被标记过
{
sum++; //计数器+1
z[k]=1; //标记以防重复
}
}
}
}
cout<<sum; //输出
return 0;
}
解法总结
通过遍历集合中的每一对数,计算它们的和,并检查这个和是否在集合中存在,可以有效地解决这个问题。使用 数组 z[ ] 来存储已经找到的和,可以避免重复计算,提高效率。