华师一附中OI组

标题: P2141 珠心算测验 [打印本页]

作者: admin    时间: 2018-5-11 12:01
标题: P2141 珠心算测验
https://www.luogu.org/problemnew/show/P2141
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

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

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

(本题目为2014NOIP普及T1)

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

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

输出格式:
输出共一行,包含一个整数,表示测验题答案。

输入输出样例
输入样例#1:
4
1 2 3 4
输出样例#1:
2
说明
【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

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


作者: GTR    时间: 2018-5-18 20:10
  1. #include<iostream>
  2. using namespace std;
  3. int n,c,d,e=0;
  4. int main()
  5. {
  6.     cin>>n;
  7.     int a[n],b[n];
  8.     for (int i=1;i<=n;i++)
  9.     {
  10.         cin>>a[i];
  11.         b[i]=a[i];
  12.     }
  13.     for(int i=1;i<=n-1;++i)
  14.     {
  15.         c=a[i];
  16.         for(int j=i+1;j<=n;++j)
  17.         {
  18.             d=a[j];
  19.             for(int k=1;k<=n;++k)
  20.             {
  21.                 if( b[k] == c+d)
  22.                 {
  23.                     e++;
  24.                     b[k] = 0;
  25.                 }
  26.             }
  27.         }
  28.     }
  29.     cout<<e;
  30.     return 0;
  31. }
复制代码

作者: admin    时间: 2018-5-18 20:12
你们都具备把程序写的很长的能力哦,为什么我总是写不长呢?思路: 先排序,减少查找的次数。(例子:电子表格中姓名栏统计姓陈的人的个数,我们可以考虑排序之后在来数)
后面的一个起步比前面一个大1,避免了重复,技巧!
统计的数数字的个数  不是方案的种数,所以要用布尔数组中转一下,不能直接s++。
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int mn=110;
  5. int a[mn];
  6. bool s[mn];
  7. int i,j,k,ss,n;

  8. int main()
  9. {
  10.     cin>>n;
  11.     for (i=1; i<=n; i++) cin>>a[i];
  12.     sort(a+1, a+n+1); ///排序
  13.     ///for (i=1;i<=n;i++) cout<<a[i]<<' ';

  14.     for (j=1; j<=n-2; j++)
  15.         for (k=j+1; k<=n-1; k++)
  16.             for (i=k+1; i<=n; i++)
  17.                 if (a[i]==a[j]+a[k])s[i]=1;
  18.                 ///看看某个数是否可以由前面的两个数加起来



  19.     for (i=1;i<=n;i++) ss=ss+s[i];
  20.     cout<<ss;
  21.     return 0;
  22. }
复制代码




作者: admin    时间: 2018-5-18 20:28
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int mn=110;
  5. int a[mn];
  6. bool s[mn];
  7. int i,j,k,ss,n;

  8. int main()
  9. {
  10.     cin>>n;
  11.     for (i=1; i<=n; i++) cin>>a[i];
  12.     sort(a+1, a+n+1); ///排序
  13.     ///for (i=1;i<=n;i++) cout<<a[i]<<' ';

  14.     for (j=1; j<=n-2; j++)
  15.         for (k=j+1; k<=n-1; k++)
  16.             for (i=k+1; i<=n; i++)
  17.                 if (a[i]==a[j]+a[k])s[i]=1;
  18.                 ///看看某个数是否可以由前面的两个数加起来



  19.     for (i=1;i<=n;i++) ss=ss+s[i];
  20.     cout<<ss;
  21.     return 0;
  22. }
复制代码

作者: WJL    时间: 2018-5-18 22:25
本帖最后由 WJL 于 2018-5-19 08:52 编辑
  1. #include<iostream>
  2. using namespace std;
  3. int n,c,d,e=0;
  4. int a[n],b[n];
  5. int main()
  6. {

  7.     cin>>n;

  8.     for (int i=1;i<=n;i++)
  9.     {
  10.         cin>>a[i];
  11.         b[i]=a[i];
  12.     }
  13.     for(int i=1;i<=n-1;i++i)
  14.     {
  15.         c=a[i];
  16.         for(int j=i+1;j<=n;j++)
  17.         {
  18.             d=a[j];
  19.             for(int k=1;k<=n;k++)
  20.             {
  21.                 if( b[k] == c+d)
  22.                 {
  23.                     e++;
  24.                     b[k] = 0;
  25.                 }
  26.             }
  27.         }
  28.     }
  29.     cout<<e;
  30.     return 0;
  31. }
复制代码

作者: universehyf    时间: 2018-7-1 12:50
#include<iostream>
using namespace std;
int a[101];
int main()
{
        int n,c=0;
        cin>>n;
        for(int i=1;i<=n;i++)
                cin>>a[i];
        for(int i=1;i<=n;i++)
        {       
                bool p=false;
                for(int j=1;j<=n;j++)
                {       
                        for(int k=1;k<=n;k++)
                                if((i!=j)&&(j!=k)&&(i!=k)&&(a[i]==a[j]+a[k]))
                                p=true;       
                }
                if(p)        c=c+1;
        }
        cout<<c;
        return 0;
}
作者: vc_vitamine    时间: 2018-7-5 19:41
本帖最后由 vc_vitamine 于 2018-7-5 19:43 编辑
  1. #include<iostream>
  2. using namespace std;
  3. const int maxn=110;
  4. int a[maxn];
  5. int c[20020];
  6. int n;
  7. int ans;
  8. int main()
  9. {
  10.     cin>>n;
  11.     for(int i=1; i<=n; i++)
  12.     {
  13.         cin>>a[i];
  14.         c[a[i]]=1;
  15.     }
  16.     for(int i=1; i<=n-1; i++)
  17.         for(int j=i+1; j<=n; j++)
  18.             if(c[a[i]+a[j]])
  19.             {
  20.                 ans++;
  21.                 c[a[i]+a[j]]=0;
  22.             }
  23.     cout<<ans;
  24.     return 0;
  25. }
复制代码


作者: 倚窗倾听风吹雨    时间: 2018-7-6 12:52
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[101],b[101]={};
  4. int n,m,i,j,t=0,k;
  5. int main()
  6. {
  7.     cin>>n;
  8.     for(i=1;i<=n;i++)cin>>a[i];
  9.     for(m=1;m<=n-1;m++)
  10.         for(j=m+1;j<=n;j++)
  11.             for(k=1;k<=n;k++)
  12.                 if(a[k]==a[m]+a[j]&&b[k]==0){t++;b[k]=1;}
  13.     cout<<t;
  14.     return 0;
  15. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2