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的 ...
随机推荐
- html5刮刮卡
通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...
- Apache的rewrite规则详细介绍
Apache的rewrite规则详细介绍 发布日期:2008-09-02 16:16 来源: 作者: 点击:7044 rewrite标志 R[=code](force redirect) 强制外部重定 ...
- Basic Example of JMX Technology--转载
原文地址:http://nick-lab.gs.washington.edu/java/jdk1.5b/guide/jmx/tutorial/connectors.html Basic Example ...
- Hibernate中的"Repeated column in mapping for entity"异常
转:http://lijiejava.iteye.com/blog/786535 一对多双向关联(类Item与类Bid): Item类: public class Item { private int ...
- Android_Notification
xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- 到目前为止,Linux下最完整的Samba服务器配置攻略
关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...
- Oracle计算连续天数,计算连续时间,Oracle连续天数统计
Oracle计算连续天数,计算连续时间,Oracle连续天数统计 >>>>>>>>>>>>>>>>> ...
- 解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABTkAAAJwCAIAAADN5fIdAAAgAElEQVR4nOzdfZAc1X3o/VNFlbcoJf
- sql2008存储过程解密。
今天有一个同事在做一个项目的时候,因为现在公司不跟某一家公司合作.有一些sql的存储过程是加密,现在想打开那些存储过程来解密.故查看了一些资料终于解密成功.步骤如下: 1.需要开始DAC连接. 1.1 ...
- 解决VS报表.rdl 显示乱码“小方块”问题
报表在编辑状态显示文本显示小方块 如图 原因:字体格式是英文状态下. 解决:选中文本框,选择文本框属性,选择字体,字体改成宋体或微软雅黑.就可以了.