[NOIP 2014 普及组] 珠心算测验 · 教师题解

[NOIP 2014 普及组] 珠心算测验

知识点

枚举、集合、去重

解题思路

枚举两个不同下标i<j,将a[i]+a[j]加入集合。随后逐个检查原数组中有多少个数在集合内。

正确性说明

每对不同元素恰好被枚举一次,集合记录所有可表示为两个不同元素之和的值。对每个原数组元素只判定一次,故不会因不同分拆方案重复计数。

易错点

必须用两个不同下标;题目原数组值互不相同;统计符合条件的数的个数,而不是表示方案数。

复杂度

构造哈希集合期望时间O(n²),查询期望O(n),额外空间O(n²)。

参考代码(GNU C++17)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;cin>>n;vector<int>a(n);for(int &x:a)cin>>x;unordered_set<int>s;
    for(int i=0;i<n;++i)for(int j=i+1;j<n;++j)s.insert(a[i]+a[j]);
    int ans=0;for(int x:a)ans+=s.count(x);cout<<ans<<'\n';
}
返回题目