我要肆了 2024-11-30 15:45 采纳率: 100%
浏览 5
已结题

C++二分查找:节目 难度:中阶 时间限制:2000ms 内存限制:512MB

C++
题目难度:中阶
时间限制:2000ms
内存限制:512MB



题目描述
小T作为班级的班长,承担着班级的各项事务,今天班主任交给了小T一个重要的任务,学校的运动会就要开始了,要小T帮忙协助开幕式,开幕式正在进行,有n位同学列阵站在操场上,每位同学都有一个属于自己的数字,现在老师会突然喊一个数字,被叫到的同学就需要举起手中的花,但是也有可能喊到的数字和所有同学的都不相同,现在小T想知道被叫到的同学编号,由于这个数字太大了,小T才小学一年级,还算不过来,需要你帮帮他。

输入格式
第一行一个整数n表示同学的数量。

第二行一个整数Q表示老师的询问次数。

第三行用空格隔开的n个整数ai表示同学们的数字。

第四行用空格隔开的Q个整数bi表示老师喊的数字。

输出格式
Q行,每行一个数表示答案,如果有被叫的同学,就输出对应同学的编号,这里的编号为1n,如果有多个同学被叫到,则输出编号最小的,如果没有同学被叫到,则输出-1。

样例数据
样例输入#1
5
3
5 8 4 9 4
4 5 2
样例输出#1
3
1
-1
数据范围
对于30%的数据,1<=n,Q<=100。

对于50%的数据,1<=n,Q<=1000。

对于100%的数据,1<=n,Q<=100000,1<=ai,bi<=10^9

等,急!

  • 写回答

2条回答 默认 最新

  • 我要肆了 2024-12-01 11:23
    关注

    自己问AI打出来了……

    #include <iostream>
    #include <unordered_map>
    #include <vector>
    
    using namespace std;
    
    int main() {
        int n, Q;
        cin >> n >> Q;
        
        vector<int> students(n);
        for (int i = 0; i < n; ++i) {
            cin >> students[i];
        }
        
        unordered_map<int, int> number_to_index;
        for (int i = 0; i < n; ++i) {
            // 如果数字已经存在,只保留最小编号
            if (number_to_index.find(students[i]) == number_to_index.end() || number_to_index[students[i]] > i + 1) {
                number_to_index[students[i]] = i + 1;
            }
        }
        
        vector<int> queries(Q);
        for (int i = 0; i < Q; ++i) {
            cin >> queries[i];
        }
        
        for (int i = 0; i < Q; ++i) {
            if (number_to_index.find(queries[i]) != number_to_index.end()) {
                cout << number_to_index[queries[i]] << endl;
            } else {
                cout << -1 << endl;
            }
        }
        
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月9日
  • 已采纳回答 12月1日
  • 修改了问题 11月30日
  • 创建了问题 11月30日