华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1243|回复: 8
打印 上一主题 下一主题

P2141 珠心算测验

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
#
发表于 2018-5-11 12:01:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
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。

回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
8#
发表于 2018-7-6 12:52:40 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

51

主题

61

帖子

222

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
222
7#
发表于 2018-7-5 19:41:03 | 只看该作者
本帖最后由 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. }
复制代码

回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
6#
发表于 2018-7-1 12:50:59 | 只看该作者
#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;
}
回复 支持 反对

使用道具 举报

3

主题

50

帖子

365

积分

中级会员

Rank: 3Rank: 3

积分
365
5#
发表于 2018-5-18 22:25:20 | 只看该作者
本帖最后由 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. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
地板
 楼主| 发表于 2018-5-18 20:28:24 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2018-5-18 20:12:54 | 只看该作者
你们都具备把程序写的很长的能力哦,为什么我总是写不长呢?思路: 先排序,减少查找的次数。(例子:电子表格中姓名栏统计姓陈的人的个数,我们可以考虑排序之后在来数)
后面的一个起步比前面一个大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. }
复制代码



回复 支持 反对

使用道具 举报

4

主题

21

帖子

89

积分

注册会员

Rank: 2

积分
89
沙发
发表于 2018-5-18 20:10:52 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 00:36 , Processed in 0.110001 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表