C++ map映射的使用方法
今天考试做了道题,用上了map,这是一道提高组联赛难度的题目,先发题目:
******************************
1. A-B problem
( dec.c/cpp/pas) .
Description
大家都非常熟悉 A+B Problem!
题目看多了也有审美疲劳,于是我舍弃了,改用 A-B problem!
题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A-B=C 的数对
的个数。( 注意: 不同位置的数字一样的数对算不同的数对)
Input Format
第一行包括 2 个非负整数 N 和 C,中间用空格隔开。
第二行有 N 个整数,中间用空格隔开,作为要求处理的那串数。
Output Format
输出一行,表示该串数中包含的所有满足 A-B=C 的数对的个数。
Sample Input
4 1
1 1 2 3
Sample Output
3
Data Limit
对于 50%的数据, N <= 2000;
对于 100%的数据, N <= 200000。
******************************
看到这题,第一反应就是用桶,多方便啊。可是看到这里的数据规定:长整型……相信不会再有人用普通的数组来做桶了。
这里我机智地用到了一种对象:map。
map,将键映射到值的对象。
比如你需要把日期转为数字,比如把"7月30日"转换为730,怎么转换呢?
别的麻烦办法我就不说了,说下map怎么实现:
先定义一个map:
map<string,int>date;
嗯,尖括号里的那个string代表date这个map的键(KEY)是字符串型的,而string后面那个int表示date所映射存储的值是整数。
然后我们定义:
date["7月30日"]=730;
OK,完事了。
之后要输出的话:
cout<<date["7月30日"];
下面贴出将字符串日期转换为数字的完整代码:
#include <iostream>
#include <map>
using namespace std;
map<string,int>date;
int main()
{
date["7月30日"]=;
cout<<date["7月30日"];
return ;
}
没错就是这么愉快与简单就完事了。
明白了map的用法我们回到题目。
咱们定义一个map桶:
map<long,int>m;
这个桶的用法(就是普通的桶的用法):m[i]表示数字i出现的次数。
如果我们用普通数组,那么根据题意,我们定义的数组的成员个数至少为2147483647,就是长整型的最大值。
而map为什么不会超呢?因为map是映射,它那个中括号里的数字只是一个键(这说起来很复杂……)……唉,口头表达能力不行,简单了说吧,就是说map你没有定义过某个键,它就不会占用空间,当你去映射一个没有访问过的键时,它会自动返回0。等于是说map桶去除了所有的空桶所占的空间。那么这题中我们只会用到<=200000个桶。
贴上代码:
#include <cstdio>
#include <map>
using namespace std;
map<long,int> m;//咱们的map桶
int n;
long c,num[];
int main()
{
scanf("%d%ld",&n,&c);//n个数字,c是差值
int ans=,i=n;
while(i--)
{
scanf("%d",&num[i]);
m[num[i]]++;//装到桶里去~
}
i=n;
if(c>)//特判0
while(i--)
ans+=m[num[i]+c];
else
while(i--)
ans=ans+m[num[i]+c]-;//当c为0时每个数字还得排掉自己呢~
printf("%d",ans);
return ;
}
这里只用了25行,就打完了整个题目。看着别的童鞋打个几十行代码还没法AC,心里乐呵呀~
不过说一下,这样的算法时间复杂度是nlogn,因为map读取的速度是logn,所以速度不是很快。话说最快是二分+缩点,有兴趣的童鞋可以去做做。
最后说一下:STL大发好,退C转C++保平安……
C++ map映射的使用方法的更多相关文章
- Java集合中Map接口的使用方法
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...
- SpringMVC处理器映射器和方法名称解析器
所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping Ha ...
- Java精选笔记_集合【Map(映射)接口】
Map(映射)接口 简介 该集合存储键值对,一对一对的往里存,并且键是唯一的.要保证map集合中键的唯一性. 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value. 关键字是以后用于检 ...
- 标准模板库(STL)学习指南之map映射
转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...
- java 遍历map的四种方法
16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...
- PHP转Go系列:map映射
映射的定义 初识映射会很懵,因为在PHP中没有映射类型的定义.其实没那么复杂,任何复杂的类型在PHP中都可以用数组表示,映射也不例外. $array['name'] = '平也'; $array['s ...
- Map集合中的方法
Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...
- 遍历map的四种方法
方法一 在for-each循环中使用entries来遍历这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用.注意:for-each循环在Java 5中被引入所以该方法只能应用于j ...
- ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 从点1出发,假设现在在i,点数为sta,则下一步的点数必然不能是sta的 ...
随机推荐
- Making the impossible: 3 nodes intercontinental replication--转载
原文:http://www.percona.com/blog/2012/01/11/making-the-impossible-3-nodes-intercontinental-replication ...
- CentOS内核升级
CentOS 6.5自动内核升级的主要步骤: 1)内核文件下载到/usr/src/kernel/目录下: 如:2.6.32-431.5.1.el6.x86_64编译后差不多有48M大小: 2)生成的引 ...
- About gpref O(n2) --> O(1)
http://www.ibm.com/developerworks/cn/linux/l-gperf.html 命令行处理和 gperf 的作用 命令行处理一直以来都是软件开发中最容易被忽视的领域.几 ...
- 4.关于phpstudy for linux 的安装(LNMP)更好的环境请看8.LNMP环境
phpstudy真的很坑爹! 所以我在后面重新写了一个LNMP环境的集成包应用! 首先,我们在自己本地开发的时候一般使用的虚拟机的权限账号都是最高的,也就是我们的root账户 PS:我已经更改镜像源为 ...
- js观察者模式
观察者模式存在观察者和被观察者 被观察者的状态发生改变,通知观察者调用观察者的update方法,观察者的update方法对被观察者的状态进行检测,做出相应的操作 被观察者存在接口attach,deta ...
- asp.net服务器页面处理过程
一.静态页面.动态页面区别 静态页面是服务端直接从硬盘里面读取然后发回去,动态页面就要创建这个页面类的对象,调用对象的方法,方法里面什么就发回什么.浏览器请求asp.net页面实际是请求asp.net ...
- Java简单算法--出圈问题
package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...
- Sophos UTM WebAdmin存在未明漏洞
...
- String类中toCharArray()方法的用法
该方法的作用是返回一个字符数组,该字符数组中存放了当前字符串中的所有字符 eg: public class class6_3 { public static void main(String arg ...
- Cisco交换机中的flash,Rom,RAM,nvram的区别
Flash内存,也叫闪存,是路由器当中常用的一种内存类型.它是可读写的存储器,在系统重新启动或关机之后仍能保存数据.Flash中存放着当前使用中的IOS(路由器操作系统). 只读内存(ROM)在Cis ...