一.一道題目引發我對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],輸出結果如下圖:
我想着為什么只在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的函數
參考: