今天考试做了道题,用上了map,这是一道提高组联赛难度的题目,先发题目:

******************************

1A-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映射的使用方法的更多相关文章

  1. Java集合中Map接口的使用方法

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...

  2. SpringMVC处理器映射器和方法名称解析器

    所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping Ha ...

  3. Java精选笔记_集合【Map(映射)接口】

    Map(映射)接口 简介 该集合存储键值对,一对一对的往里存,并且键是唯一的.要保证map集合中键的唯一性. 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value. 关键字是以后用于检 ...

  4. 标准模板库(STL)学习指南之map映射

    转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...

  5. java 遍历map的四种方法

    16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...

  6. PHP转Go系列:map映射

    映射的定义 初识映射会很懵,因为在PHP中没有映射类型的定义.其实没那么复杂,任何复杂的类型在PHP中都可以用数组表示,映射也不例外. $array['name'] = '平也'; $array['s ...

  7. Map集合中的方法

    Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...

  8. 遍历map的四种方法

    方法一  在for-each循环中使用entries来遍历这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用.注意:for-each循环在Java 5中被引入所以该方法只能应用于j ...

  9. ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 从点1出发,假设现在在i,点数为sta,则下一步的点数必然不能是sta的 ...

随机推荐

  1. IIS 之 添加MIME扩展类型及常用的MIME类型列表

    经常用IIS作为下载服务器的时候有时传上去的文件比如 example.mp4 文件名上传后,但是用http打开的时候确显示为 404 文件不存在.其实是IIS对文件的一种保护,不在IIS指定的MIME ...

  2. 面试体验:Google 篇(转)

    http://www.cnblogs.com/cathsfz/archive/2012/08/08/google-interview-experience.html 尝试在自己的博客上搜索点东西,结果 ...

  3. Android 100多个Styles快速开发布局XML,一行搞定View属性,一键统一配置UI...

    Android开发中大量使用XML代码作为界面的布局,使用styles能大幅精简XML代码. 比如下面这个界面从AlertDialog至PlacePickerWindow有19个样式相同的跳转Item ...

  4. Linux进程IPC

    IPC mechanisms supported by Linux include pipes, named pipes, semaphores, message queues, shared mem ...

  5. 一致性Hash算法及使用场景

    一.问题产生背景      在使用分布式对数据进行存储时,经常会碰到需要新增节点来满足业务快速增长的需求.然而在新增节点时,如果处理不善会导致所有的数据重新分片,这对于某些系统来说可能是灾难性的. 那 ...

  6. centos 7访问windows共享文件夹

    1. 首先centos要能识别win7的文件系统ntfs,原版的centos是不支持NTFS格式的文件系统,因此需要安装ntfs支持软件包,我使用的是rpmforge软件库,在此处http://pkg ...

  7. Spring MVC中如何指定某个类或方法自适配地响应某个HTTP请求?

    方法已经找到,即调用AbstractHandlerMethodAdapter.handle() public final ModelAndView handle(HttpServletRequest  ...

  8. 将秒格式化为时分秒的JS函数

    //时间格式化 function GetDateTime(time) { if (time >= 60 && time <= 3600) { time = parseInt ...

  9. 组装和拆分JSON

    1.组装JSON                     rs["msg"] = "success";                     rs[" ...

  10. 转:『代码』JS封装 Ajax级联下拉列表

    在博客园看到一篇不错的AJAX级联下拉列表,觉得不错,特地拿下来 :转载来自:『大雪无痕』 ,原文地址 //当一个 下拉列表 改变时,触发所有联动:(警告:各下拉列表之间 请不要出现 循环依赖) // ...