【题目来源】
【题目描述】
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 足以通过数据。
【算法代码】
【参考文献】