当前位置:首页 > GESP > GESP五级算法题解:小杨的幸运数字(洛谷B3929)代码分析与优化

GESP五级算法题解:小杨的幸运数字(洛谷B3929)代码分析与优化

18小时前

GESP五级算法题解:小杨的幸运数字(洛谷B3929)代码分析与优化 GESP五级 算法题解 哈希表优化 第1张

一、题目解读

洛谷题目B3929“小杨的幸运数字”要求处理一系列查询数字x,将其转化为≥x的最小幸运数字。幸运数字定义为:≥a的完全平方数的倍数。题目难点在于高效判断和生成幸运数,避免超时。

二、解题思路

采用“预生成+哈希表”策略:

1. 分步生成:先找出≥a的所有完全平方数(超级幸运数),再生成其倍数(幸运数)。

2. 哈希加速:使用unordered_set存储幸运数,实现O(1)查询。

3. 边界优化:通过预处理查询数组的最大值,缩小生成范围,避免无效计算。

三、解题步骤

1. 输入与预处理:读取N个查询,记录最大值max_x,并预留1000缓冲避免边界溢出。

2. 生成幸运数集合:调用generateLuckyNumbers(a, max_x+1000),分两层循环生成超级幸运数及其倍数,存入哈希集。

3. 查询处理:若x本身为幸运数直接输出;否则通过makeLucky(x)循环递增查找第一个幸运数。

四、代码与注释

#include iostream  
#include vector  
#include cmath  
#include unordered_set  
using namespace std;  

// 生成幸运数集合(超级幸运数+倍数)  
unordered_set<int> generateLuckyNumbers(int a, int max_x) {  
    unordered_set<int> lucky_numbers;  
    for (int i = ceil(sqrt(a)); i <= max_x; i++) {  // 从a的平方根开始找完全平方数  
        int super_lucky = i * i;  
        lucky_numbers.insert(super_lucky);  
        for (int j = 2; super_lucky * j <= max_x; j++) {  // 生成倍数  
            lucky_numbers.insert(super_lucky * j);  
        }  
    }  
    return lucky_numbers;  
}  

// 查找比x大的最小幸运数  
int makeLucky(int x, const unordered_set<int>& lucky_numbers) {  
    while (true) {  
        if (lucky_numbers.count(x)) return x;  // 若x在集合中直接返回  
        x++;  
    }  
}  

int main() {  
    int a, N;  
    cin >> a >> N;  
    vector<int> queries(N);  
    int max_x = 0;  
    for (int i = 0; i < N; i++) {  
        cin >> queries[i];  
        if (queries[i] > max_x) max_x = queries[i];  
    }  
    unordered_set<int> lucky_numbers = generateLuckyNumbers(a, max_x + 1000);  // 生成幸运数集合  
    for (int x : queries) {  
        if (lucky_numbers.count(x)) {  
            cout << "lucky" << endl;  
        } else {  
            cout << makeLucky(x, lucky_numbers) << endl;  
        }  
    }  
    return 0;  
}

五、总结

本解法通过“预生成+哈希表”将时间复杂度优化至O(N+√a),空间复杂度O(幸运数数量)。关键在于:

1. 精准控制生成范围,避免冗余计算;

2. 利用哈希表快速判断幸运数;

3. 缓冲处理防止边界问题。

该策略适用于大规模数据的高效处理,是解决此类数学分类问题的典型思路。

参考:2023年GESP五级题小杨的幸运数题解

原创内容 转载请注明出处

分享给朋友:

相关文章

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

一、题目解读2024年GESP(青少年编程能力等级测试)五级题目「奇妙数字」(对应洛谷平台题目B4070),要求选手根据特定规则计算输入数字的“奇妙值”。题目核心在于挖掘数字的数学特性,结合质因数分解...

GESP五级题巧夺大奖解题报告:贪心算法优化与代码实现(洛谷B3872)

GESP五级题巧夺大奖解题报告:贪心算法优化与代码实现(洛谷B3872)

一、题目解读2023年GESP五级题目“巧夺大奖”(洛谷B3872)是一个经典的资源分配问题。题目要求玩家在有限时间内选择多个游戏,每个游戏有截止时间和奖励值,需在截止时间前完成游戏以获得奖励。目标是...

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

一、题目解读题目要求实现一个“字典替换”功能:给定一个字典(键值对映射)和一段文本,将文本中出现的字典中的单词替换为其对应的值,未匹配的单词用“UNK”代替。需处理标点符号分隔单词,并确保输入异常情况...

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

一、题目解读题目要求对n名学生的语文、数学、英语成绩进行排序,并输出按原始输入顺序的排名。排序规则需依次比较总分、语数总分、语数最高分,若完全相同时保持原始顺序。需处理并列排名,确保相同成绩的学生获得...

洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析

洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析

一、题目解读洛谷P1102题要求处理一组整数数组与常数C,统计数组中是否存在元素A与B满足A+B=C。用户需输出满足条件的数对数量。题目关键在于快速判断是否存在互补元素,时间复杂度需优化以避免暴力遍历...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。