洛谷 P1918:保龄球 ← STL map

【题目来源】
https://www.luogu.com.cn/problem/P1918

【题目描述】
DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷。因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招。
DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位置的瓶子的数量。他突然发现这是一个炫耀自己好视力的借口 --- 他看清远方瓶子的个数后从某个位置发球,这样就能打倒一定数量的瓶子。
1. ◯◯◯
2. ◯◯◯ ◯
3. ◯
4. ◯ ◯
如上图,每个 “◯” 代表一个瓶子。如果 DL 想要打倒 3 个瓶子就在 1 位置发球,想要打倒 4 个瓶子就在 2 位置发球。
现在他想要打倒 m 个瓶子。他告诉你每个位置的瓶子数,请你给他一个发球位置。

【输入格式】
第一行包含一个正整数 n,表示位置数。
第二行包含 n 个正整数 ai,表示第 i 个位置的瓶子数,保证各个位置的瓶子数不同。
第三行包含一个正整数 Q,表示 DL 发球的次数。
第四行至文件末尾,每行包含一个正整数 m,表示 DL 需要打倒 m 个瓶子。

【输出格式】
共 Q 行。每行包含一个整数,第 i 行的整数表示 DL 第 i 次的发球位置。若无解,则输出 0。

【输入样例】
5
1 2 4 3 5
2
4
7​​​​​​​

【输出样例】
3
0​​​​​​​

【数据范围】
对于 50% 的数据,1≤n,Q≤1000,1≤ai,m≤10^5。
对于 100% 的数据,1≤n,Q≤100000,1≤ai,m≤10^9。

【算法分析】
什么数据结构可以记录不连续数字的位置呢?哈希表,对应 STL 模版中的 map。
因此,定义一个 map 容器来存储各个数字的位置,对于 q 个询问,读取 map 中对应 key 值的 value。由于 map 读取元素的时间复杂度为 O(log n),因此代码的总时间复杂度为 O(nlog n),能够通过 n≤100000 的数据。
如果数据量更大,还能用 unordered_map<int> 来优化,但本题用 map 足以通过数据。

【算法代码】

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

map<int,int> mp;
int n,x,T;

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

    cin>>T;
    while(T--) {
        cin>>x;
        cout<<mp[x]<<endl;
    }

    return 0;
}

/*
in:
5
1 2 4 3 5
2
4
7

out:
3
0
*/





【参考文献】
https://mp.weixin.qq.com/s/LXBViXzCA17JWEPgkgAGlA
https://www.luogu.com.cn/problem/solution/P1918





 

posted @ 2026-01-25 20:44  Triwa  阅读(0)  评论(0)    收藏  举报