• 一道算法题加深我对C++中map函数的理解


    一.一道题目引发我对map函数的考量

    首先是题目大意:有n个银行,a[i]表示这个人在第i个银行有a[i]块钱(可以是负数),所有银行的钱加起来正好是0.每次只能在相邻的银行之间转账,问最少要转多少次就能使所有的a[i]的值为0。其中1和n相邻。

    数据范围:

    n (1 ≤ n ≤ 100 000)
    ai ( - 1e9 ≤ ai ≤ 1e9)

    解题思路:

    我自己原先的思路是随机选定一个点,比如我选择数组的第一个点(当这个点不为0,为0就选下一个),向左走或者向右走,直到走到倒数第一个不为0的值,然后比较向左走和向右走哪条路径最短,选最短的作为题目要求得到的值,但是这样操作就变得比较复杂,从网上找到了给定的答案,用到了map函数,说是前缀和,刚开始没太理解这个函数的作用,后来通过输出,才了解到这题map的功能。

    代码如下:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<map>
    
    using namespace std;
    typedef long long ll;
    
    int  a[100050];
    int main()
    {   
        map<ll, ll>b;    
        ll n, ans = 0, sum = 0;    
        cin >> n;    
        for (ll i = 1; i <= n; i++)        
        scanf_s("%d", &a[i]);    
        for (ll i = 1; i <= n; i++){        
            sum += a[i];        
            b[sum]++;        
            ans = max(ans, b[sum]);
        }    
        cout << n - ans << endl;    
        return 0;
    }

    假如输入为6个数,{0,1,2,3,-6,0},我输出了b[sum],输出结果如下图:

    image

    我想着为什么只在b[0]这里b[sum]++才起作用呢?仔细查找,才明白map<ll,ll>b,这是申明了一个容器,有点类似于python的字典,一个key值对应着一个value,可以修改value,但是不能修改key

    二.map功能和一些用法

    首先头部声明#include<map>,然后

    map<type,type> MapFunction

    上面这一句交代了key和value的类型,

    begin()         返回指向map头部的迭代器

    clear()        删除所有元素

    count()         返回指定元素出现的次数

    empty()         如果map为空则返回true

    end()           返回指向map末尾的迭代器

    equal_range()   返回特殊条目的迭代器对

    erase()         删除一个元素

    find()          查找一个元素

    get_allocator() 返回map的配置器

    insert()        插入元素

    key_comp()      返回比较元素key的函数

    lower_bound()   返回键值>=给定元素的第一个位置

    max_size()      返回可以容纳的最大元素个数

    rbegin()        返回一个指向map尾部的逆向迭代器

    rend()          返回一个指向map头部的逆向迭代器

    size()          返回map中元素的个数

    swap()           交换两个map

    upper_bound()    返回键值>给定元素的第一个位置

    value_comp()     返回比较元素value的函数

    参考:

    https://blog.csdn.net/shawn_hou/article/details/38035577#

  • 相关阅读:
    三大范式
    html 横线的代码
    CSS下拉 菜单3.27第一次
    JS页面三种打开方式及对话框
    函数整理
    3.22整理作业
    for循环,if 练习
    php测试题
    设计模式
    面向对象的三大特性
  • 原文地址:https://www.cnblogs.com/51selfstudy/p/10535283.html
Copyright © 2020-2023  润新知