题目
多鲤鱼有n个硬币,第i个硬币的值是ai。它保证所有的值都是2^i(i非负),他想知道是否bj能够用他拥有的这些钱凑出来,如果能就输出最少用几个他的硬币,如果不能就输出-1。
Example
Input
5 4
2 4 8 2 4
8
5
14
10
输入m,n,m代表他有m个硬币,各自面值为ai,n代表他要测试的数据量
m和n都小于等于1e9,ai小于等于2e9,bj小于1e9
Output
1
-1
3
2
直接附上代码
Code:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define oo 0x3f3f3f3f
#define exp 1e-6
map <int ,int>mp;
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
mp[x]++;
//下标的方式插入,如果原本key不存在则会先创建对应的记录,然后再进行赋值;
}
while(m--)
{
int ans=0,flag=0,x;
scanf("%d",&x);
map<int ,int >::reverse_iterator it;
//reverse_iterator是反向迭代器,
//mp.rbegin()就是指向最后一个
for(it=mp.rbegin();it!=mp.rend();it++)
{
int tep=min(x/it->first,it->second);
ans+=tep;
x=x-tep*it->first;
if(!x)
{
flag=1;
break;
}
}
if(flag==1)
cout<<ans<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
反向迭代器的rbegin和rend的位置
和正向迭代器的begin和end的位置如下图