P2141珠心算测验

题目描述

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

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

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

(本题目为2014NOIP普及T1)

输入格式

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

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

输出格式

一个整数,表示测验题答案。

输入输出样例

输入 #1

4
1 2 3 4

输出 #1

2

说明/提示

【样例说明】

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

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

【数据说明】

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

题目大意: 就是在给定的一组数据中判断有多少个数的值可以用所给的数据相加得到。

分析:本体直接用暴力枚举,依次计算每两个数相加的结果,然后再所给数据中去查找;做本题的时候可以先对数据进行排序,可以避免大量重复计算和循环判断。

代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int a[n]; //存放输入的数组;
    set <int> sum; //存放满足条件的数字;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
    }
    sort(a,a+n);
    for(int i=0;i<n-1;i++)
    {

        for(int j=i+1;j<n;j++)
        {
            int k;
            while(a[i]==a[j]) j++;
            int s = a[i]+a[j];
            if(s>a[n-1]) break;
            if(i<j) k=j;
            else k=i;
            for(;k<n;k++)
            {
                if(s==a[k])
                {
                    sum.insert(s);
                    //cout << a[i] << "+" << a[j] << "=" << a[k] << endl;
                }
            }
        }
    }
    cout << sum.size() <<endl;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章