当前位置: 首页 > article >正文

蓝桥杯真题 - 公因数匹配 - 题解

题目链接:https://www.lanqiao.cn/problems/3525/learning/

个人评价:难度 2 星(满星:5)
前置知识:调和级数


整体思路

  • 题目描述不严谨,没说在无解的情况下要输出什么(比如 n n n 1 1 1),所以我们先假设数据保证有解;
  • 2 2 2 1 0 6 10^6 106 枚举 x x x 作为约数,对于约数 x x x 去扫所有 x x x 的倍数,总共需要扫 n 2 + n 3 + n 4 + ⋯ + n n ≈ n ln ⁡ n \frac{n}{2}+\frac{n}{3}+\frac{n}{4}+\cdots+\frac{n}{n}\approx n\ln n 2n+3n+4n++nnnlnn 次;
  • 取所有 x x x 的倍数在原数组中的下标,这些下标对应的数字一定同时包含 x x x 这个约数,取这些下标中最小的两个 i d x 1 , i d x 2 idx_1,idx_2 idx1,idx2,就是满足题意的以 x x x 为约数的两个数的下标;
  • 最后对所有约数 x x x 取最满足题意的 i d x 1 , i d x 2 idx_1,idx_2 idx1,idx2 即可(如果存在多组 i , j i,j i,j,请输出 i i i 最小的那组。如果仍然存在多组 i , j i,j i,j,请输出 i i i 最小的所有方案中 j j j 最小的那组。)

过题代码

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

typedef long long LL;
const int maxn = 1000000 + 100;
int n, x;
pair<int, int> ans;
vector<int> idx[maxn];
priority_queue<int> que;

int main() {
#ifdef ExRoc
    freopen("test.txt", "r", stdin);
#endif // ExRoc
    ios::sync_with_stdio(false);

    cin >> n;
    ans = {n + 1, n + 1};
    for (int i = 1; i <= n; ++i) {
        cin >> x;
        idx[x].push_back(i);
    }
    for (int i = 1; i < maxn; ++i) {
        sort(idx[i].begin(), idx[i].end());
        while (idx[i].size() > 2) {
            idx[i].pop_back();
        }
    }
    for (int i = 2; i < maxn; ++i) {
        while (!que.empty()) {
            que.pop();
        }
        for (int j = i; j < maxn; j += i) {
            for (int k = 0; k < idx[j].size(); ++k) {
                que.push(idx[j][k]);
                if (que.size() > 2) {
                    que.pop();
                }
            }
        }
        if (que.size() < 2) {
            continue;
        }
        int r = que.top();
        que.pop();
        int l = que.top();
        que.pop();
        if (l < ans.first) {
            ans = {l, r};
        } else if (l == ans.first) {
            if (r < ans.second) {
                ans = {l, r};
            }
        }
    }
    cout << ans.first << " " << ans.second << endl;

    return 0;
}

http://www.kler.cn/a/509797.html

相关文章:

  • RabbitMQ-消息可靠性以及延迟消息
  • Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!
  • YOLOv5训练长方形图像详解
  • 【设计模式-结构型】装饰器模式
  • 使用 Docker 部署 Java 项目(通俗易懂)
  • PL/SQL语言的语法糖
  • 【LLM】Openai-o1及o1类复现方法
  • 《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
  • vue | 插值表达式
  • K近邻算法实战——电影分类算法
  • 迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...
  • QQ邮箱登录逆向
  • 前端包管理工具npm、pnpm 和 Yarn 的总结对比
  • Python爬虫(5) --爬取网页视频
  • C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14
  • 机器学习中的方差与偏差
  • Kubernetes (K8s) 入门指南
  • rocketmq集群启动和下线
  • 花诗蕾奇亚籽抹茶代餐粉和固态速溶茶,YYDS!
  • 免费的数据标注工具
  • 2.5 如何评估表示学习
  • 深度学习基础知识
  • Hive集群的安装准备
  • .Net 6.0 .Net7.0 .Net8.0 .Net9.0 使用 Serilog 按日志等级写入日志及 appsetting.json 配置方式实现
  • Linux 管道操作
  • java工程学习步骤