当水题遇上了map大坑

晚上写一个dp,弄了半天样例一直不过,对着队友的代码一行行看,发现跟自己逻辑完全一样啊。。。

然后就逐行输出比对,发现预处理出了问题,把map插入新值的地方改了下,果然就好了。。。

折腾半晚上,不吐不快。

以前使用STL的map时,一直把它当作一种高级数组,很少使用insert来插入键值对,都是直接用下标索引直接插入新值。而在map中查找key时,我也一般直接采取判断mp[key]是否为0。

而这题这样用也没多大问题,就怪我太作了,把tot默认设置为-1,方便++tot后从0开始计数。。。

但是插入跟第一个相同的key时,由于ID[key]==0,就把ID[key]的值更新了。。。

调试半天都没发现这样的bug啊T_T T_T T_T

直接上AC代码:

#include<iostream>
#include<vector>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<map>
using namespace std;
const int INF = 0x3f3f3f3f;
int b, tot;
map<string, int> ID;
struct book{int id;int cost;
}books[110];int dp[1<<22];int main()
{int cost;while(cin>>cost) {books[b].cost = cost;string line, book;getline(cin, line);stringstream ss(line);while(ss>>book) {// if(!ID.count(book)) ID.insert(make_pair(book, ++tot));// if(ID.find(book)==ID.end()) ID.insert(make_pair(book, ++tot));// map里没有键book,则插入if(!ID[book]) ID[book] = ++tot;books[b].id |= 1<<(ID[book]-1);}b++;}int S = 1<<tot;dp[0] = 0;for(int i=1;i<S;i++) dp[i] = INF;for(int i=0;i<S;i++) {for(int j=0;j<b;j++) {dp[i|books[j].id] = min(dp[i|books[j].id], dp[i]+books[j].cost);}}cout<<dp[S-1]<<endl;return 0;
}

最后关于map的使用,还是推荐注释部分的写法。

这篇博客讲了这两种插入的效率问题,我想区别不是太大,直接用ID[book]=++tot也是可以的。

在以后的使用中还是要尽量避免直接使用下标访问,应该如果你要访问的key不存在的话,会默认插入新的值,size也会增加。

map的查找操作使用总结如下

  1. 在map中,由key查找value时,首先要判断map中是否包含key。

  2. 如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value会取默认值0。

  3. map提供了两种方式,查看是否包含key,m.count(key),m.find(key)。

  4. m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。

  5. m.find(key):返回迭代器,判断是否存在。

转载于:https://www.cnblogs.com/izcat/p/10680808.html

简单DP (Preparing for Xtreme 12.0) | STL map使用相关推荐

  1. Pig安装及简单使用(pig0.12.0 hadoop2.2.0)

    我们用MapReduce进行数据分析.当业务比较复杂的时候,使用MapReduce将会是一个很复杂的事情,比如你需要对数据进行很多预处理或转换,以便能够适应MapReduce的处理模式,另一方面,编写 ...

  2. Android简单适配9.0~12.0

    适配6.0~8.0的可以看下这个: 适配Android6.0到8.0详细过程--小白教程 注意:10.0到12.0的都是些网上看到的资料,我就适配到10.0的文件存储,如有不对的,可以留言,我会查阅修 ...

  3. Flink1.12.0简单实现wordcount

    文章目录 前言 一.Flink1.12.0简单实现wordcount 二.使用步骤 1.引入pom.xml 2.主类 3.运行结果 总结 前言 Flink1.12.0简单实现wordcount 一.F ...

  4. Codeforces 41D Pawn 简单dp

    题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...

  5. hdu2067 简单dp或者记忆化搜索

    题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. P1005 矩阵取数游戏(__int128模板/简单dp)

    转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j ​ 均为非负整数.游戏规则如下: 每次取数时 ...

  7. 第3章 感受(一)——3.12. Hello STL 向量篇

    [回到目录] 白话C++ 3.12. Hello STL 向量篇 " 好消息!第XXX届国际美女大赛即将在中国举行,届时将有2999名来自世界各地的美女参赛.最新消息表明,本次大赛将对所有数 ...

  8. 4.15 每周作业 —— 简单DP

    免费馅饼 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  9. NUC-ACM/ICPC 寒假训练 简单DP A - G题

    第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记 ...

最新文章

  1. OpenStack RPM Sample 解析
  2. [恢]hdu 2077
  3. 2017百度之星程序设计大赛 - 初赛(A)数据分割
  4. android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...
  5. html布局(盒子)
  6. 微软老兵 Antoine LeBlond 将正式离职
  7. 写了10年Javascript未必全了解的标识符顺序
  8. 电子计算机专业vs土木工程专业,最难学十大工科专业 不想累成狗就别去(高薪)...
  9. Nodejs教程09:实现一个带接口请求的简单服务器
  10. 关于maven项目中的Missing artifact *.jar ...
  11. Java:计算立方体的体积和底面积
  12. C语言实现矩阵卷积运算
  13. 计算机硬盘和分区是什么关系,电脑硬盘如何分区 电脑硬盘分区注意事项【详解】...
  14. emcy协议_商铺三方租赁协议合同范本
  15. eas bos编码重复
  16. 【云IDE】CSDN云IDE的初探以及实战操作
  17. 显卡和CPU的关系像“主仆”,GPU的工作原理是什么
  18. 自动化1121和1122班学生链接
  19. “新基建”背景下,智慧灯杆产业面临的问题及思考
  20. IT行业招聘技巧--渠道篇

热门文章

  1. Java:清空文件内容
  2. Git学习总结(一)
  3. webpack学习笔记--安装
  4. ubuntu 安装lamp
  5. Ubuntu设置RS-232串口登陆终端(译文,节选)
  6. Linux,OS X mark工具(目录跳转工具)
  7. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...
  8. (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
  9. 40 | 案例篇:网络请求延迟变大了,我该怎么办?
  10. 服务端命令(dockerd)