算法
(枚举,哈希,预处理) $O(n^2)$
由于每个数的范围都在10000以内,因此两个数的和在20000以内,所以可以开一个长度是20000的bool数组,然后枚举所有数对,将所有计算出的两数之和标记一下。
然后再枚举每个数,利用bool数组判断它是否是某两个数的和。
时间复杂度
枚举所有数对的计算量是 $O(n^2)$,最后判断每个数是否是某两个数的和的计算量是 $O(n)$,因此总时间复杂度是 $O(n^2)$。
C++ 代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int a[N];
bool st[20010];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
for (int i = 0; i < n; i ++ )
for (int j = 0; j < i; j ++ )
st[a[i] + a[j]] = true;
int res = 0;
for (int i = 0; i < n; i ++ ) res += st[a[i]];
printf("%d\n", res);
return 0;
}
此题是不是有点坑人,3+5=8 和7+1 =8 这算一种还是两种
多谢提醒,好像只算一种才行
真好的题解,一开始我还用的三重循环,没想到可以用bool数组,思路好清晰,方法好巧妙!
谢谢闫老师的回答
不客气~
老师,在第二次枚举中,为什么用 res += st[a[i]]?
等价于
if (st[a[i]]) res ++ ;
牛啊又是我根本想不出来的思路,三重循环爆搜只通过了两个orz
这思维真的牛
这题可以用二分来做吗
yes