bluecode-【米小游】20250329_3_小米游的数组询问

时间限制:C/C++ 1000MS,其他语言 2000MS

内存限制:C/C++ 256MB,其他语言 512MB

难度:困难

出题人:root

描述

小米游拿到了一个数组,她有若干次询问,每次询问输入一个x,她希望你判断x能否由数组中的两个元素相乘得出。

用数学语言描述,你需要寻找到两个下标i和j(i<j),满足a_i*a_j=x。

输入描述

第一行输入一个正整数n,代表数组的大小。

第二行输入n个正整数a_i,代表数组的元素。

第三行输入一个正整数q,代表询问次数。

接下来的q行,每行输入一个正整数x,代表一次询问。

1 < n,q < 10^5

1< a_i,x < 10^6

输出描述

对于每次询问,如果无法找到两数乘积等于x,请输出-1 -1。

否则输出i和j(i<j),用空格隔开,代表a_i*a_j=x。

用例输入 1

复制代码
5
1 2 3 2 4
2
4
5

用例输出 1

复制代码
2 4
-1 -1

提示

样例1说明

第一组询问,输出1 5也是可以的。

第二组询问,显然无法找到两个元素相乘等于5。

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    // 读取数组
    vector<int> a(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    
    int q;
    cin >> q;
    
    // 对于每个询问进行处理
    while(q--) {
        int x;
        cin >> x;
        
        // 使用哈希表存储元素及其下标
        unordered_map<int, int> mp;
        bool found = false;
        
        // 遍历数组
        for(int i = 0; i < n; i++) {
            // 如果 x 能被 a[i] 整除
            if(x % a[i] == 0) {
                int target = x / a[i];
                // 如果之前已经出现过 target
                if(mp.count(target)) {
                    cout << mp[target] + 1 << " " << i + 1 << endl;
                    found = true;
                    break;
                }
                // 将当前元素存入哈希表
                mp[a[i]] = i;
            }
        }
        
        if(!found) {
            cout << "-1 -1" << endl;
        }
    }
    
    return 0;
}
相关推荐
Joyee69123 分钟前
文本领域的在线协作引擎——OT 算法的原理与应用
算法
lisw0529 分钟前
排序算法可视化工具——基于React的交互式应用
算法·react.js·排序算法
奋进的小暄1 小时前
贪心算法(13)(java)合并区间
算法
快来卷java1 小时前
深入剖析雪花算法:分布式ID生成的核心方案
java·数据库·redis·分布式·算法·缓存·dreamweaver
阿巴~阿巴~1 小时前
C/C++蓝桥杯算法真题打卡(Day11)
算法
tpoog1 小时前
[MySQL]数据类型
android·开发语言·数据库·mysql·算法·adb·贪心算法
刚入门的大一新生1 小时前
排序算法3-交换排序
算法·排序算法
董董灿是个攻城狮2 小时前
Transformer 通关秘籍7:词向量的通俗理解
算法
卷卷的小趴菜学编程3 小时前
算法篇-------------双指针法
c语言·开发语言·c++·vscode·算法·leetcode·双指针法
komo莫莫da3 小时前
Day14 动态规划(3)
算法·深度优先·动态规划