珠心算测验
描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
格式
输入格式
输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。
输出格式
输出共一行,包含一个整数,表示测验题答案。
样例输入:
4
1 2 3 4
样例输出:
2
限制
对于 100%的数据,3 ≤ n ≤ 100,测验题给出的正整数大小不超过 10,000。
提示
由 1+2=3,1+3=4,故满足测试要求的答案为 2。注意,加数和被加数必须是集合中的两个不同的数。
分析:这题其实很简单!我们就用打标记的方式:先开一个比较大的数组,20002,命名为flag.这个数组中,以输入数组为下标的那些数全部设为0.如:flag[arr[i]] = 0.然后再次遍历这个flag数组,把以arr[i]+arr[j]为下标的元素全部设为1.这是什么意思呢?就是我通过这种方式可以找到满足题目要求的这种数。最后再次遍历,只需要计算有多少元素值为1就可以了。
下面直接上代码:
1 #include <iostream> 2 #define N 100 3 using namespace std; 4 int arr[N]; 5 int flag[20002]; 6 int main() 7 { 8 int n; 9 cin >> n; 10 for (int i = 0; i < n; i++) { 11 cin >> arr[i]; 12 flag[arr[i]] = 0; 13 } 14 for (int i = 0; i < n; ++i) { 15 for (int j = i + 1; j < n; ++j) { 16 flag[arr[i] + arr[j]] = 1; 17 } 18 } 19 int res = 0; 20 for (int i = 0; i < n; ++i) { 21 if (flag[arr[i]] == 1) { 22 ++res; 23 } 24 } 25 cout << res << endl; 26 return 0; 27 }
来看看运行效果: