今天考试做了道题,用上了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. html5刮刮卡

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...

  2. Apache的rewrite规则详细介绍

    Apache的rewrite规则详细介绍 发布日期:2008-09-02 16:16 来源: 作者: 点击:7044 rewrite标志 R[=code](force redirect) 强制外部重定 ...

  3. Basic Example of JMX Technology--转载

    原文地址:http://nick-lab.gs.washington.edu/java/jdk1.5b/guide/jmx/tutorial/connectors.html Basic Example ...

  4. Hibernate中的"Repeated column in mapping for entity"异常

    转:http://lijiejava.iteye.com/blog/786535 一对多双向关联(类Item与类Bid): Item类: public class Item { private int ...

  5. Android_Notification

    xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  6. 到目前为止,Linux下最完整的Samba服务器配置攻略

    关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...

  7. Oracle计算连续天数,计算连续时间,Oracle连续天数统计

    Oracle计算连续天数,计算连续时间,Oracle连续天数统计 >>>>>>>>>>>>>>>>> ...

  8. 解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABTkAAAJwCAIAAADN5fIdAAAgAElEQVR4nOzdfZAc1X3o/VNFlbcoJf

  9. sql2008存储过程解密。

    今天有一个同事在做一个项目的时候,因为现在公司不跟某一家公司合作.有一些sql的存储过程是加密,现在想打开那些存储过程来解密.故查看了一些资料终于解密成功.步骤如下: 1.需要开始DAC连接. 1.1 ...

  10. 解决VS报表.rdl 显示乱码“小方块”问题

    报表在编辑状态显示文本显示小方块 如图 原因:字体格式是英文状态下. 解决:选中文本框,选择文本框属性,选择字体,字体改成宋体或微软雅黑.就可以了.