洛谷:P2141 珠心算測驗
題目描述
珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練,既能夠開發智力,又能夠爲日常生活帶來很多便利,因而在很多學校得到普及。
某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另外兩個(不同的)數之和?
最近老師出了一些測驗題,請你幫忙求出答案。
(本題目爲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。
思路:定義兩個數組A,B。 A記錄所有兩個數相加的和,B記錄所有的兩位數,然後在B數組搜索A數組裏出現的所有和,出現過一次則次數++。
比如現在有: 1,2,3,4 四個數 那麼A[6]={3,4,5,5,6,7} ,B[4]={1,2,3,4}
在B裏面找A是否有相同,是則次數++,答案是:2
題解:
/**
* @author:氣場五十米
* @data:2020/4/26
* @language:C++
* @CSDN: xingly.bolg.csdn.net
*/
#include<bits/stdc++.h>
using namespace std;
int a[20010],b[20010];
int main()
{
int x[110]={},n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x[i]; //讀入所有數
b[x[i]]=1; //標記爲出現過
}
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
a[x[i]+x[j]]++; //記錄和出現幾次
}
int ans=0;
for(int i=0;i<=20000;i++)
{
if(b[i]&&a[i]>0) ans++; //b[i]表示他們的和也在所有數中,a[i]>0表示他們的和出現了,可能不止一次
}
cout<<ans;
return 0;
}