【CCF-CSP201403-1】相反数

1. 题目要求

在这里插入图片描述


2. 解答

2.1 哈希表做法

哈希表的查找复杂度是 1,可以将每个数插入一个 unordered_set 然后查找是否有相反数,由于每个数字最多只会被查找记录一次,所以时间复杂度是 O ( n ) O(n) O(n)
CCF-CSP 在线训练系统没有开放 C++11 选项,而 unordered_set 是 C++11 的 STL 的一种,所以在测试系统上会出现编译错误。不过据说考试时可以自选是否使用 C++11 。在此还给出一种数组做法,以备考试时随机应变。

#include <iostream>
#include <unordered_set>
using namespace std;

int main()
{
	unordered_set<int> hash;
	int n;
	scanf("%d", &n);
	int a, cnt = 0;
	while(n --) {
		scanf("%d", &a);
		if(hash.count(-a)) cnt ++;
		hash.insert(a);
	}
	printf("%d", cnt);
	return 0;
}

2.2 数组做法

同样的可以开一个计数数组,遇到下标值或者其相反数就 +1,最后看数组中的元素有多少个是 2 即可。
这个思路可以成功的条件是,题目中说明了没有重复的数字。

#include <iostream>
#include <cstdlib>
using namespace std;

const int N = 1010;
int nums[N];

int main()
{
	int n;
	scanf("%d", &n);
	int a;
	while(n --) {
		scanf("%d", &a);
		nums[abs(a)] ++;
	}
	int res = 0;
	for(int i = 0; i < N; i ++) {
		if(nums[i] == 2) res ++;
	}
		
	cout << res;
	return 0;
}

3. 总结

这一题比较简单,但是也要注意题目的条件。第二种做法比较巧妙,是建立在没有重复数据的基础上的,如果有重复数据的话,则适合采用第一种做法。(当然如果有重复数据,可能还会有其他的规则,比如限定在某个数之前是否出现了相反数,之后出现的不计等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值