1. 程式人生 > >珠心算

珠心算

珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練,既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。

某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另外兩個(不同的)數之和?

最近老師出了一些測驗題,請你幫忙求出答案。

(本題目為2014NOIP普及T1)

輸入輸出格式

輸入格式:

 

共兩行,第一行包含一個整數nn,表示測試題中給出的正整數個數。

第二行有nn個正整數,每兩個正整數之間用一個空格隔開,表示測試題中給出的正整數。

 

輸出格式:

 

一個整數,表示測驗題答案。

 

輸入輸出樣例

輸入樣例#1: 

4
1 2 3 4

輸出樣例#1: 

2

說明

【樣例說明】

由1+2=3,1+3=41+2=3,1+3=4,故滿足測試要求的答案為22。

注意,加數和被加數必須是集合中的兩個不同的數。

【資料說明】

對於100\%100%的資料,3 ≤ n ≤ 1003≤n≤100,測驗題給出的正整數大小不超過10,00010,000。

AC_CODE: 

#include<bits/stdc++.h>
using namespace std;
int t[200005], used[200005];//t是桶,t[i]表示值為i的數在集合中兩兩相加出現了幾次,used[i]表示值為i的數是否在集合中,1為在,0為不在
int n, a[105], ans;
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];//讀入
		used[a[i]] = 1;//在集合中賦值為1
	}
	for (int i = 1; i < n; i++) {//列舉
		for (int j = i + 1; j <= n; j++) {
			t[a[i] + a[j]]++;//被加出來了
		}
	}
	for (int i = 1; i <= 200002; i++) {
		if (t[i] > 0 && used[i]) ans++;//判斷是否滿足,滿足ans++
	}
	cout << ans << endl;
	return 0;
}