一.一道题目引发我对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的函数
参考: