洛谷【入门4】数组 P2141 [NOIP2014 普及组] 珠心算测验

[NOIP2014 普及组] 珠心算测验

题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

(本题目为2014NOIP普及T1)

输入格式
共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。

第二行有nn个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式
一个整数,表示测验题答案。

输入输出样例
输入 #1复制

4
1 2 3 4

输出 #1复制

2

说明/提示
【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。

注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

对于100%的数据,3≤n≤100,测验题给出的正整数大小不超过10,000。

这里介绍两种写法

第一种暴力穷举,用数组去重。
注意:要输出数量而不是几种,比如1+4=5与2+3=5是一种不是两种

AC代码(C++)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{	
	vector<bool>addnum;
	int n;
	//初始化统计器
	int sum = 0;
	//根据题意可以得知-1肯定比输入数小
	int maxnum = -1;
	cin >> n;
	int arr[128] = { 0 };
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
		//寻找最大数
		maxnum = max(maxnum, arr[i]);
	}
	//最大数的两倍长度足够
	addnum.resize(static_cast<std::vector<bool, std::allocator<bool>>::size_type>(maxnum * 2 + 1));
	//初始化用false填满,默认无答案
	fill(addnum.begin(), addnum.end(), false);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (arr[i] != arr[j])		//不一样的两数和当做下标来标记两数和
				addnum[static_cast<std::vector<bool, std::allocator<bool>>::size_type>(arr[i] + arr[j])] = true;
	//输入数当下标寻找符合条件的答案并统计
	for (int i = 0; i < n; i++)
		if (addnum[arr[i]])
			sum++;
	cout << sum;
	return 0;
}

第二种暴力穷举,用STL的set容器去重。
AC代码(C++)

#include <iostream>
#include <set>

using namespace std;

int main()
{	
	set<int>ans;
	int n;
	//初始化统计器
	int sum = 0;
	cin >> n;
	int arr[128] = { 0 };
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (arr[i] != arr[j])		
				//不一样的两数和放入容器,set是唯一性容器,里面的值不会重复,达到去重效果
				ans.insert(arr[i] + arr[j]);
	//find如果没有找到集合中的元素,那么迭代器会在集合的末尾。
	//所以如果it不在集合末尾,那么说明it在集合中出现过,那么进行统计
	for (int i = 0; i < n; i++)
		if (ans.find(arr[i]) != ans.end())
			sum++;
	cout << sum; 
	return 0;
}

PS:部分测试数据
输入:

100
6094 106 5958 877 3352 8959 292 9253 3860 448 5709 8295 4667 2588 3663 2486 1129 8870 3126 6203 727 4316 6541 9689 8818 2119 7331 7598 1879 7303 1100 8740 4567 2649 2373 7505 5848 4337 9953 4436 8395 8273 1028 4449 3363 6254 7856 6710 8422 3833 5690 6664 6326 2550 119 2075 3475 9024 3239 8889 807 543 8103 1441 9731 3873 5194 9557 3256 6245 3266 2777 4552 2390 8550 4777 9701 5694 9133 6736 2586 298 3695 1992 2958 3831 6905 8134 989 6292 8967 118 8442 1765 931 4760 5945 1703 6262 1671

输出:

22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值