stl库中的map (反向迭代器)以及例题

 

codeforces 1003d

n个硬币,q次询问。第二行给你n个硬币的面值(保证都是2的次幂!)。每次询问组成b块钱,最少需要多少个硬币?

Example
Input
5 4
2 4 8 2 4
8
5
14
10
Output
1
-1
3
2

解题思路:总体上使用的是贪心策略,从最大面值的往下贪心选择就可以了,由于数据量较大这里使用了map,这样就最多才32个数。第一次使用map的迭代器

反向迭代器的rbegin和rend的位置
和正向迭代器的begin和end的位置如下图

这里写图片描述

#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
map<int,int>mp;
int main()
{
    int n,m,a,b,i;
    scanf("%d%d",&n,&m);
    for(i=0; i<=n-1; i++)
    {
        scanf("%d",&a);
        mp[a]++;
    }
    for(i=1;i<=m;i++)
    {
        int flag=0;
        int ans=0;
        scanf("%d",&a);
        map<int,int>::reverse_iterator it;//反向迭代器
        for(it=mp.rbegin();it!=mp.rend();it++)
        {
            int z=min(a/it->first,it->second);
            a-=z*it->first;
            ans+=z;
            if(a==0)
            {
                flag=1;
                break;
            }
        }
        if(flag==1)
        {
            printf("%d\n",ans);
        }
        else
            printf("-1\n");

    }

}

 

转载于:https://www.cnblogs.com/bhd123/p/9441377.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值