一道算法題加深我對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#


免責聲明!

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



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