2014NOIP普及组真题 1. 珠心算测验

线上OJ:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1965

核心思想:

1、题目所求为"有多少个数=其他两个数之和 ",故不管5是由1+4组成,还是2+3组成,都只算一次。

2、利用 set自动去重 的功能,只要将结果丢进set,最后输出set的size即可

3、由于题目的 n 只有100,非常小,所以可以用三重循环暴力枚举直接完成

cpp 复制代码
#include <bits/stdc++.h>
#define MAXN 105
using namespace std;

set<int> s; // 利用set有自动去重的功能,只要将结果丢进set,最后输出set的size即可
int n;
int a[MAXN];

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)  cin >> a[i];

    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
            for(int k = 1; k <= n; k ++)
            {
                if(a[i]+a[j]==a[k])
                {
                    s.insert(a[k]);
                }
            }

    cout << s.size() << endl;
    return 0;
}
思考:

如果 n 的范围超过 1 0 3 10^3 103,则上述方法会超时,这是可以考虑反向枚举答案 ,因为ai不超过10,000,所以最终的和不超过20000。只要 建20000个桶,最后看哪些桶的结果被标记过了即可

cpp 复制代码
#include <bits/stdc++.h>
#define MAXN 105
using namespace std;

int n, ans = 0;
int a[MAXN];
int res[20005] = {0};

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)  cin >> a[i];

    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
            res[a[i] + a[j]] = 1; // 标记为计算过

    for(int i = 1; i <= n; i++)
        if(res[ a[i] ]) ans++;   // 如果a[i]数组中的值在res[i]被标记过,则ans++

    cout << ans << endl;
    return 0;
}
相关推荐
qeen871 分钟前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI12 分钟前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
Augustzero14 分钟前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ32 分钟前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_01 小时前
C++正则表达式
开发语言·c++·正则表达式
民乐团扒谱机1 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
Nil2082 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-2 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点2 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学