【NOIP2014】珠心算測驗
NOIP 2014普及組
題目描述
珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練,既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。
某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另外兩個(不同的)數之和?
最近老師出了一些測驗題,請你幫忙求出答案。
(本題目為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。
解析:
其實這個題並不是很難,只要思路對了就行了。
之前樓主做的時候,學校的伺服器上的資料有問題,導致樓主一直WA,於是只好向管理員要來資料進行求解,終於發現:題目裡說了,這其中的數都是各不相同的,而管理員的資料裡有相同的數,於是樓主寫了一個超水的程式碼,把他所有的相同的資料加上MMP之後輸出了,然後滿屏的MMP。呵呵~
因為他考率的是集合中兩個不同數的和,所以遇到這種題,先進行排序,在C++中有sort可以直接用於排序,比所謂的冒泡好用多了
{
插一個題外話,之前樓主在寫程式的時候以限制不喜歡用sort,我也不知道為什麼,現在能把sort用的賊溜,以至於我都忘記在沒接受sort之前我是怎麼排序的,昨天在雲盤翻程式碼,翻到了去年夏天去參加NOIP 夏令營的時候的程式碼,看到的我一次用sort寫的一個程式碼,因為之前老師一直讓我用,我就是不用,那次突然用了,把老師還搞得很是驚訝,說了句,“欸,你現在也用STL這個了啊?!”當時使用我們的方言說的,現在還猶在耳畔,心裡那麼多感慨,其實高中最後悔的一件事就是沒拿到NOIP 的一等獎,辜負了老師對我的期望吧。
}
閒話說完了,排完序之後,陣列中後邊的數一定比前面的大(因為題目中說要加和而且這兩個數要不能相同),所以咱們從第三個數開始看,前兩個數是一定不可能的了。這個式子可以寫成C=A+B的形式。我們可以考慮這個範圍是B<A<C,所以,設C對應的下標是i,A的下標是j,B的下標是p,根據排序結果,p<j<i;當找到C=A+B的時候,break,因為題目中的求的是C的個數!!!
例如當輸入是
5
1 2 3 4 5
答案:3
如果不加break的時候,結果就是錯誤的答案4,因為
3=1+2
4=1+3
5=1+4
5=2+3
#include<bits/stdc++.h>
using namespace std;
int main()
{
//freopen("1.txt","r",stdin);
//freopen("ou.txt","w",stdout);
int n,count,flag;
int a[100001];
while(scanf("%d",&n)!=EOF)
{
count=0;
flag=0;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=2;i<n;i++)
{
flag=0;
for(int j=1;j<i;j++)
{
for(int p=0;p<j;p++)
{
if(a[j]+a[p]==a[i])
{
flag=1;
count++;
break; //注意break!!!!!
}
}
if(flag)
break;
}
}
int t=0;
for(int i=1;i<n;i++)
if(a[i]==a[0])
t=i;
int len=0;
for(int i=t;i<n;i++)
{
len=0;
for(int j=i+1;a[j]==a[i];j++,i++)
len++;
count-=len;
}
cout<<count<<endl;
}
return 0;
}