题目描述
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列 , 这个问题的答案就是 , 因为 。
输入格式
共两行,第一行是数列中数的个数 ( ),第二行是由 个不大于 的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出格式
一个整数,即数列中等于其他两个数之和的数的个数。
样例
样例输入
4
1 2 3 4
样例输出
2
要有代码要写思路
双循环计算两数之和,再与原数组值进行比较,相同则加1
#include <iostream>
using namespace std;
int main()
{
int a[100];
int n,i,j,m=0,k;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
int s = a[i]+a[j];
for(k=0;k<n;k++)
{
if(s == a[k])
{
m++;
break;
}
}
}
}
cout<<m;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[50005],b[50005],i,j,n,tot;//tot:存储有多少个数满足条件,a[50005]是输入用的,b[50005]是保存任意两数之和用的
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}//输入
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j==i)
{
continue;
}//避免同一个数相加
else
{
b[i+j]=1;//如i=2,j=3,那么b[5]=1,表示有5这个和存在
}
}
}
for(i=1;i<=n;i++)
{
if(b[a[i]])//如果a[i]=3,且b[3]不为0,则做一次加法
{
tot++;
}
}
cout<<tot;//输出个数
return 0;
}
ps:楼上那位第32行是错的,中文逗号?
不就是简单的for循环就能搞定了吗。
当n<=2000左右时,可以用以下代码解决
双循环枚举求和,再把每个数进行比较
样例已过,set优化。
时间复杂度O(N^2)
#include<bits/stdc++.h>
using namespace std;
int n,a[3009];
set<int> mixture;
int main() {
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)//两两枚举求和,放入set中
for(int j=i+1;j<=n;j++)
mixture.insert(a[i]+a[j]);
int ans=0;
for(int i=1;i<=n;i++)
if(mixture.count(a[i]))ans++;//查找set中是否有这个数
cout<<ans;
return 0;
}
也可以用优化了一点的方法,二分查找
#include<bits/stdc++.h>
using namespace std;
int n,a[3009];
int main() {
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
int ans=0;
//最小的两个数一定无法作为答案,从第三个数开始算
for(int i=3;i<=n;i++) {
//此时从比这个数小的数里取一个数,找到另外一个和它搭配能=当前数的
for(int j=1;j<i;j++) {
//需要找到的另外的数就是(a[i]-a[j])
//利用二分查找,直接获得这个数的所在位置
int tmp=upper_bound(a+1,a+1+i,a[i]-a[j])-a;
if(a[tmp-1]==a[i]-a[j]) {
ans++;
break;//退出这一层的for循环
}//用得到的位置判断是否去到正确的数
}
}
cout<<ans;
return 0;
}