当水题遇上了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[]; int dp[<<]; 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 |= <<(ID[book]-);
}
b++;
} int S = <<tot;
dp[] = ;
for(int i=;i<S;i++) dp[i] = INF;
for(int i=;i<S;i++) {
for(int j=;j<b;j++) {
dp[i|books[j].id] = min(dp[i|books[j].id], dp[i]+books[j].cost);
}
}
cout<<dp[S-]<<endl;
return ;
}

最后关于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):返回迭代器,判断是否存在。

简单DP (Preparing for Xtreme 12.0) | STL map使用的更多相关文章

  1. URAL 1203 Scientific Conference 简单dp 难度:0

    http://acm.timus.ru/problem.aspx?space=1&num=1203 按照结束时间为主,开始时间为辅排序,那么对于任意结束时间t,在此之前结束的任务都已经被处理, ...

  2. Codeforces 41D Pawn 简单dp

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

  3. poj1189 简单dp

    http://poj.org/problem?id=1189 Description 有一个三角形木板,竖直立放.上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周 ...

  4. 『简单dp测试题解』

    这一次组织了一场\(dp\)的专项考试,出了好几道经典的简单\(dp\)套路题,特开一篇博客写一下题解. Tower(双向dp) Description 信大家都写过数字三角形问题,题目很简单求最大化 ...

  5. 简单 dp

    1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...

  6. HDU 5375 Gray code (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...

  7. 洛谷P1130红牌(简单DP)

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...

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

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

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

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

随机推荐

  1. NEO4J亿级数据全文索引构建优化

    NEO4J亿级数据全文索引构建优化 一.数据量规模(亿级) 二.构建索引的方式 三.构建索引发生的异常 四.全文索引代码优化 1.Java.lang.OutOfMemoryError 2.访问数据库时 ...

  2. C9 vs 三星

    我还是更喜欢 C9, 可惜当年的牛B人物 LemonNation 不在了,C9 赢 三星 一局的机会都没有了. 伟大的 LemonNation ,软件工程学硕士, 2014年,LemonNation ...

  3. activemq设置后台管理用户名密码,及生产者消息密码

    activemq设置后台管理用户名密码,及生产者消息密码 1.修改conf/activemq.xml 在<broker>标签下,找到</shutdownHooks>标签.在这个 ...

  4. protobuf文档翻译-安装,数据格式及编码规范

    Install Download protobuf: https://github.com/protocolbuffers/protobuf/releases unzip protoc-3.8.0-l ...

  5. K-Anonymous Sequence

    K-Anonymous Sequence 给出一个递增的长度为n的序列\(\{a_i\}\),现在你可以进行一次操作,选择若干个数,分别减少任意一个正整数,定义权值为这些正整数之和,询问操作使得新序列 ...

  6. jmeter+ant+jenkins 搭建接口自动化测试环境

    过程参考:http://www.cnblogs.com/lxs1314/p/7487066.html 1. 安装ant 2. 安装jenkins 遇到问题: 启动Tomcat后,访问http://lo ...

  7. php数据结构课程---7、队列实战

    php数据结构课程---7.队列实战 一.总结 一句话总结: 注意条件:注意循环的条件(比如while循环打印队列元素时),注意if的条件 把问题想清楚:比如链表操作初次插入元素和后面再插,效果是不一 ...

  8. 如何HOOK桌面窗口消息

    代码详见:http://download.csdn.net/detail/swanabin/6771465 需求:截获桌面窗口鼠标单击事件,解析所选中的桌面 Item,并将解析后的 item 信息发送 ...

  9. vue导航条选中项样式

    html: <div id="app"> <div class="collection"> <a href="#!&qu ...

  10. 20.multi_case05

    #coding:utf-8 # 通过gather方法 import asyncio async def a(t): print('-->', t) await asyncio.sleep(0.5 ...