见链接
首先,我要说一句:
既然题目说要去重,那不就是用个set吗?
创建一个查找用的set和一个去重的set。
由于这道题 n ≤ 100 n \le 100 n≤100,而STL的set插入与查找的时间复杂度均为 O ( log n ) \operatorname O(\operatorname{log}n) O(logn),所以可以用 ( n 2 ) \operatorname(n^2) (n2)的暴力枚举来做。
所以这道题的时间复杂度是 O ( n 2 log n ) \operatorname O(n^2\operatorname{log}n) O(n2logn)。
C + + \operatorname C++ C++代码如下。
#include <bits/stdc++.h> using namespace std; typedef set<int>::iterator setIt;//定义set<int>的迭代器别名 set <int> setFind;//查找用的set set <int> setUniq;//去重用的set int n, a[105]; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", a + i);//等价于scanf("%d", &a[i]); setFind.insert(a[i]);//存入集合 } //----暴力枚举----// for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++){ int tmp = a[i] + a[j]; setIt iter = setFind.find(tmp); if (it != setFind.end()) {//存在 setUniq.insert(*it); delete it; } } cout << setUniq.size(); return 0; }2014年NOIP普及组第1题 ↩︎