map首例

本文介绍了一个算法问题,涉及处理大量硬币(其价值为2的幂)并解答一系列查询,每个查询要求找到达到指定数值所需的最少硬币数量。通过使用哈希映射记录每种面值的硬币数量,实现高效查询。

Polycarp has nn coins, the value of the ii-th coin is aiai. It is guaranteed that all the values are integer powers of 22 (i.e. ai=2dai=2d for some non-negative integer number dd).

Polycarp wants to know answers on qq queries. The jj-th query is described as integer number bjbj. The answer to the query is the minimum number of coins that is necessary to obtain the value bjbj using some subset of coins (Polycarp can use only coins he has). If Polycarp can't obtain the value bjbj, the answer to the jj-th query is -1.

The queries are independent (the answer on the query doesn't affect Polycarp's coins).

Input

The first line of the input contains two integers nn and qq (1≤n,q≤2⋅1051≤n,q≤2⋅105) — the number of coins and the number of queries.

The second line of the input contains nn integers a1,a2,…,ana1,a2,…,an — values of coins (1≤ai≤2⋅1091≤ai≤2⋅109). It is guaranteed that all aiai are integer powers of 22 (i.e. ai=2dai=2dfor some non-negative integer number dd).

The next qq lines contain one integer each. The jj-th line contains one integer bjbj — the value of the jj-th query (1≤bj≤1091≤bj≤109).

Output

Print qq integers ansjansj. The jj-th integer must be equal to the answer on the jj-th query. If Polycarp can't obtain the value bjbj the answer to the jj-th query is -1.

Example

Input

5 4
2 4 8 2 4
8
5
14
10

Output

1
-1
3
2

该题由于数据量过大,用map记录每个2的n次方出现的个数

 

 

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
map<int, int> mp;
int n, q;
int main()
{
    scanf("%d%d", &n, &q);
    for (int i = 0; i < n; i++)
    {
        int t;
        scanf("%d", &t);
        mp[t]++;
    }
    while (q--)
    {
        int b;
        scanf("%d", &b);
        int ans = 0;
        for (int i = 1<<30; i >= 1; i /= 2)
        {
            int x = min(mp[i], b/i);
            ans += x;
            b -= x*i;
        }
        if (b)
            ans = -1;
        printf("%d\n", ans);
    }
    int p=1<<30;
    printf("%d\n",p);
    return 0;
}

 

<think> 首先,用户的问题是关于Perl语言中map函数的使用方法。我需要参考提供的引用,并基于它们构建一个清晰、结构化的回答。 引用内容: - [^1]:介绍Perl中map函数的用法和示例,提到map函数替代foreach循环,处理数组元素。 - [^2]:一个Perl脚本示例,使用map和正则表达式来过滤数字元素并乘以2。 - [^3]:解释map函数的工作原理,强调它替代foreach循环,处理每个元素并通过BLOCK返回新数组。 - [^4]:另一个示例,使用map和ucfirst函数将数组元素的首字母大写。 系统级指令: - 所有行内数学表达式使用$...$格式(但Perl map函数不涉及数学表达式,所以可能不适用,除非有变量说明)。 - 独立公式使用$$...$$格式并单独成段(同样,可能不适用)。 - LaTeX语法正确(确保任何数学表达式正确)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 用户可见层:回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户的问题:"我想查找perl语言中map函数的使用方法 请问perl语言中map函数的使用指南" 所以,我的回答应该包括: 1. 解释map函数的基本概念。 2. 如何使用map函数。 3. 示例代码。 4. 注意事项。 5. 生成相关问题。 结构: - 开头介绍map函数。 - 逐步说明用法。 - 提供示例。 - 结尾生成相关问题。 添加引用:在引用的段落末尾添加引用标识,例如:[^1] 从引用中提取关键点: - map函数用于处理数组的每个元素,并返回一个新数组(来自[^3])。 - 它替代了foreach循环(来自[^3])。 - 示例:过滤数字并乘以2(来自[^2])。 - 另一个示例:使用ucfirst函数首字母大写(来自[^4])。 - 注意事项:不要修改$_,因为它直接修改原始数组(来自[^3])。 确保回答真实可靠:基于提供的引用,这些引用似乎可靠,所以我用它们。 现在,构建回答大纲: 1. **介绍map函数**:简要解释map函数是什么和用途。 2. **基本语法**:描述语法,如 map BLOCK LIST 或 map EXPR, LIST。 3. **工作原理**:解释map如何处理元素。 4. **示例代码**:提供一到两个简单示例。 5. **注意事项**:提到不要修改$_以避免副作用。 6. **总结**:简要重述。 7. **生成相关问题**:在结束时添加相关问题。 使用中文回答。 最终,添加引用标识: - 例如,当解释map替代foreach时,添加[^3]。 - 当提供示例时,添加相应的引用。 相关问题:基于主题,生成2-3个相关问题,如: 1. map函数与grep函数的区别? 2. 如何在map中使用复杂表达式? 3. map函数的性能如何? 系统指令说“生成相关问题”,并在示例中列出相关问题部分。 </think> ### Perl语言中map函数使用指南 Perl的`map`函数是一种高效的列表处理工具,它允许你对数组或列表中的每个元素执行操作,并返回一个新的列表。`map`函数的核心思想是替代传统的`foreach`循环,简化代码并提高可读性。它的基本语法是`map BLOCK LIST`或`map EXPR, LIST`,其中`BLOCK`是一个代码块,`EXPR`是一个表达式,`LIST`是输入列表。在处理过程中,每个元素被赋值给特殊变量`$_`,然后由`BLOCK`或`EXPR`处理结果组成新数组返回[^3]。 #### 1. **map函数的基本用法** - **工作原理**:`map`遍历输入列表的每个元素,将当前元素存储在`$_`中,然后执行指定的代码或表达式。处理后的结果收集成一个新数组返回。例如,`map { $_ * 2 } @array`会将数组每个元素乘以2。 - **语法形式**: - 使用代码块:`map { ... } @list` - 使用表达式:`map EXPR, @list`(如`map ucfirst, @names`) - 优点:简化迭代,避免显式循环,代码更简洁。但需注意,直接修改`$_`会改变原始数组元素,可能导致副作用(除非有特殊需求,应避免修改`$_`)[^3]。 #### 2. **示例代码** 以下示例基于引用内容展示常见用法: - **基本转换示例**:将数组元素首字母大写。 ```perl #!/usr/bin/perl -w use strict; my @myNames = ('jacob', 'alexander', 'ethan', 'andrew'); my @ucNames = map(ucfirst, @myNames); # 使用表达式形式 print join(", ", @ucNames), "\n"; # 输出: Jacob, Alexander, Ethan, Andrew ``` 此例中,`map`调用`ucfirst`函数处理每个元素,返回新数组[^4]。 - **带条件过滤的示例**:仅处理数字元素并乘以2。 ```perl #!/usr/bin/perl -w use strict; my @array = (5, 'a', 'c', 10, 'b'); my @new_array = map { $_ * 2 if m/\d/; } @array; # 使用代码块和正则过滤 print join(", ", grep {defined} @new_array), "\n"; # 输出: 10, 20 (非数字元素返回undef, 需过滤) print "新数组长度: $#new_array\n"; # 输出索引值 ``` 此例使用代码块结合正则表达式`m/\d/`检查元素是否为数字,仅处理数字元素。注意,未匹配的元素返回`undef`,建议使用`grep`过滤undefined值[^2]。 #### 3. **注意事项** - **避免修改`$_`**:在`map`中直接修改`$_`会改变原始数组元素,这可能导致数据意外变更。推荐在代码块中新建变量处理,例如`map { my $item = $_; $item * 2 } @list`[^3]。 - **返回值处理**:`map`总是返回一个列表,长度可能与原列表不同。如果代码块返回`undef`(如条件未满足),新列表会包含空位。 - **性能考虑**:`map`比显式循环更高效,但处理大型列表时,复杂表达式可能影响性能。建议保持代码块简单。 - 与`grep`的区别:`map`用于转换元素,而`grep`用于过滤元素(如`grep { $_ > 0 } @list`返回正数元素)[^1]。 #### 4. **总结** `map`函数是Perl中强大的列表处理工具,适用于数据转换、过滤和简化迭代。通过示例和注意事项,你可以安全地应用它到实际代码中。如需更深入信息,请参考Perl官方文档或相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值