Coins and Queries
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Polycarp has d).

Polycarp wants to know answers on -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 1≤n,q≤2⋅105) — the number of coins and the number of queries.

The second line of the input contains d).

The next 1≤bj≤109).

Output

Print -1.

Example
input
Copy
5 4
2 4 8 2 4
8
5
14
10
output
Copy
1
-1
3
2

题意: 给你n个硬币,每个硬币的价值是2的幂数,然后接下来有m次查询,每次查询问这个数值最少需要多少枚硬币能凑出来?

分析: 我们直接从可能的最大的2的幂数开始枚举,遇到比数值小的就加上,注意每种硬币肯恩有多个,我们加的时候得看所需要加的个数。经过分析可以知道我们要加的是这种硬币的个数和数值所需要的最多这种硬币个数的最小值
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
int main() {
    ll n, m;
    while( cin >> n >> m ) {
        map<ll,ll> mm;
        for( ll i = 0; i < n; i ++ ) {
            ll a;
            cin >> a;
            mm[a] ++;
        }
        while( m -- ) {
            ll t;
            cin >> t;
            ll ans = 0;
            for( ll i = 1<<30; i >= 1; i /= 2 ) {
                ans += min( mm[i], t/i );
                t -= min( mm[i], t/i ) * i;
            }
            if( t ) {
                cout << -1 << endl;
            } else {
                cout << ans << endl;
            }
        }
    }
    return 0;
}

 

相关文章: