一道算法题加深我对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[];
int main()
{
map<ll, ll>b;
ll n, ans = , sum = ;
cin >> n;
for (ll i = ; i <= n; i++)
scanf_s("%d", &a[i]);
for (ll i = ; i <= n; i++){
sum += a[i];
b[sum]++;
ans = max(ans, b[sum]);
}
cout << n - ans << endl;
return ;
}
假如输入为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的函数
参考:
https://blog.csdn.net/shawn_hou/article/details/38035577#
一道算法题加深我对C++中map函数的理解的更多相关文章
- 每天一道算法题(4)——O(1)时间内删除链表节点
1.思路 假设链表......---A--B--C--D....,要删除B.一般的做法是遍历链表并记录前驱节点,修改指针,时间为O(n).删除节点的实质为更改后驱指针指向.这里,复制C的内容至B(此时 ...
- Python中map函数
1.简介 python 提供内置函数map(), 接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回.例如: (1)对于list [1, 2 ...
- Python3中map函数的问题
在Python2中map函数会返回一个list列表,如代码: >>> def f(x, y): return (x, y) >>> l1 = [ 0, 1, 2, ...
- 从一道算法题实现一个文本diff小工具
众所周知,很多社区都是有内容审核机制的,除了第一次发布,后续的修改也需要审核,最粗暴的方式当然是从头再看一遍,但是编辑肯定想弄死你,显然这样效率比较低,比如就改了一个错别字,再看几遍可能也看不出来,所 ...
- 【每天一道算法题】时间复杂度为O(n)的排序
有1,2,……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且一次只能交换两个数. 这个是以前看到的算法题,题目不难.但是要求比较多,排序算法中,时间 ...
- 提前批笔试一道算法题的Java实现
题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...
- Python中map()函数浅析
MapReduce的设计灵感来自于函数式编程,这里不打算提MapReduce,就拿python中的map()函数来学习一下. 文档中的介绍在这里: map(function, iterable, .. ...
- MySQL中group_concat函数深入理解
本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 一.MySQL中group_concat函数 完整的语法如下: gr ...
- 关于在C#中对函数重载理解
函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是 ...
随机推荐
- angular 自定义服务封装自定义http请求
在angular中将http请求,放置在一起封装成服务,可减少代码重复,方便使用 var ngpohttprest = angular.module('ngpohttprest', []); ngpo ...
- 输出简单图形(StringBuilder代替双重循环)
在有些题目中打印简单图形必须使用StringBuilder或者StringBuffer,否则会运行超时(用String都会超时). 因为在题目的要求中说到输入的n是小于1000的,用双重循环就会超时, ...
- Vue 路由组件
目录 组件数据局部化处理 路由逻辑跳转 组件传参 父传子 子传父 组件的生命周期钩子 路由传参 全家配置自定义 CSS 与 js 总结: 组件数据局部化处理 不管页面组件还是小组件,都可能会被多次复用 ...
- Ubuntu 16.04 编译安装&&用dpkg安装--zabbix3.4
编译安装zabbix3.4,官方有教程,但是遇到一些报错: 总结下来,需要安装这些环境: 更新系统: apt update apt upgrade 先装这些: apt-get install libm ...
- Laradock 如何通过 ssh 方式连接到 workspace
用 docker-compose exec workspace bash 方式可以进入容器,但是还是在 xshell 终端连接比较方便. 在网上也没找到方法,其实可以通过密钥的方式连接.记录一下仅 ...
- pytorch 调整tensor的维度位置
target.permute([0, 3, 1, 2]) 一定要使用permute以及中括号 一些在我这里没起到作用的网上的例子: 1. https://blog.csdn.net/zouxiaolv ...
- Element 表单校验不消失问题
由于不好的命名习惯,所以我的:rule :ref :model命名就是写了改,改了再写. 直到今天出现了这个毛病就是 “表单验证不消失” 比方说这里的 ‘密码不能为空’,在我已经输入了数字 ...
- 【LOJ2513】「BJOI2018」治疗之雨
题意 你现在有 \(m+1\) 个数:第一个为 \(p\) ,最小值为 \(0\) ,最大值为 \(n\) :剩下 \(m\) 个都是无穷,没有最小值或最大值.你可以进行任意多轮操作,每轮操作如下: ...
- centos查找文件\目录\内容命令
1.查找文件 find / -name 'php.ini'12.查找目录 find / -name 'path' find / -name 'path' -type d13.查找内容 find . | ...
- 十八 JQuery&Ajax&Json&Xstream
JQuery 1 是什么?有什么用? JavaScript的代码类库 简化代码,提高效率.write less do more 1 JQuery与Servlet数据交互,load方式(少用) 语法:$ ...