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");

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM