Coins and Queries
time limit per test
2 secondsmemory limit per test
256 megabytesinput
standard inputoutput
standard outputPolycarp 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; }