学习总结(贪心,stl简单应用)

一、知识内容总结

这周学习的内容还是贪心,以及补充了一些stl的基本用法
贪心算法这周主要学习了一些解题思路,通过讲解各类题目来熟悉做题的思维,如何将大问题分解为小问题的思考,如何利用贪心思维解题

【stl补充知识】

STL 是指 C++ 标准模板库,是 C++ 语言标准中的重要组成部分,其以模板类和模版函数的形式提供了各种数据结构与算法的精巧实现,如果能充分使用STL,可以在代码空间、执行时间、编码效率上得到极大的提高。
STL 大致可以分为三大类:容器(Container)、迭代器(iterator)、算法(algorithm)。

容器主要分为三类:序列式容器(vector、list、deque)、适配器容器(stack、queue、priority_queue)、关联式容器(set、multiset、map、multimap)

  • 向量(vector):连续存储的元素,位于<vector>
  • 列表(list):由节点组成的双向链表,每个结点包含着一个元素,位于<list>
    双端队列(deque):连续存储的指向不同元素的指针所组成的数组,位于<deque>
  • 栈(stack):后进先出的值的排列,位于<stack>
  • 队列(queue):先进先出的值的排列,位于<queue>
  • 优先队列(priority_queue):元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列,位于<queue>
  • 集合(set):由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,位于<set>
  • 多重集合(multiset):允许存在两个次序相等的元素的集合,位于<set>
    映射(map):由键-值对组成的集合,以某种作用于键对上的谓词排列,位于<map>
  • 多重映射(multimap):允许键对有相等的次序的映射,位于<map>
  • upper_bound和lower_bound

迭代器:C++ 的 STL 为每一种容器都定义了一种迭代器类型,迭代器是一种检查容器内元素并遍历元素的数据类型,对容器的访问操作更趋向于是用迭代器而非下标操作
迭代器类型可以用 * 操作符来访问迭代器所指向的元素。

算法:STL 算法是一些模板函数,提供了相当多的有用算法和操作

具体内容会另外在一篇博客整理

二、解决问题

最近做了许多贪心题目,下面就列举几个题的思维。
1、HDU3183 A Magic Lamp
题意
对于一个序列A[1…N],一共N个数,除去M个数使剩下的数组成的整数最小。
思路
这道题如果从删除的方法来看无疑是很麻烦的,仔细看这道题,我们可以从取数的方式来完成这道题目,N个数去除M个,即要取N-M个数使其组成的数最小。
再进一步思考,怎样取这个数呢,此时我们可以逐步考虑,从第一个数开始逐个数取,因为你总共要取N-M个数,所以在N个数中,先从前M个数中找到第一个数,第一个数的区间为1 - M+1,找到最小的标记为x,然后第二个数区间为x - M+2,以此类推。
这样就能解出这道题,但别忘记最后一步,去除前导零,毕竟这道题储存N个数是用字符数组做的。
2、HDU 1338 Game Prediction
题意:
有m个人,每人得到n张牌,牌的号码是1到n*m之间的任意n个数,每张牌都只有一张,问我至少能赢多少局。
思路:
这道题跟田忌赛马有点像,我最开始的思路是直接两个数组排序比较,然后他是m个人……
然而这道题m个人比较,
这道题可以转化为你最多输max次,那么至少赢n-max次 而最多输max次,则是对方最多赢max次,则用对方的最小的牌去依次比较你手中的牌(按照升序排),如果找到有比它小的,则对方赢一次,什么意思呢,就是 依次循环直到遍历完对方的牌。
什么意思呢,就是跟田忌赛马思路一样,既然你最小的牌都比人家小了,那干脆直接兑子换掉最大的(姑且这么看),然后把你比他大的一张牌用来赢他,把能兑子的计数,然后用N减去就可以了
3、zoj 3627 Treasure Hunt II
题意:
直线上有n个城市, 第i个城市和i+1个城市是相邻的. 每个城市都有vi的金币.
Alice和Bob站在城市p, 他们每天可以选择走向一个相邻的城市, 也可以选择不走. 他们是单独行动的.
他们经过一个城市就可以获得相应的金币(不能重复获得)
作为一个队伍, 他们的最远距离不能操作M, 问T天内, 他们最多一共能拿多少金币?
思路:
既然金币不能重复获得,而且两人之间有距离限制,那么就只能两边走,找出大范围然后小范围,小范围从右向左或者从左向右逐个城市找出最大值即可,边界条件处理很麻烦

三、感想

新补充的STL知识很难一下子就用到做题上面,sort函数用的最熟练,其他的都很生,最近做vj的时候用到了map函数,之前也做题也用过stack和queue来处理过一些问题,说实话,stl确实很好用,能省好多的代码,比如二分用upper_bound和lower_bound(说实话真的不太会用)。
再就是最近的贪心题目,感觉有些难理解,需要花一段时间来仔细读代码才能理解,但这也是一个逐渐提高的过程,日积月累总能提升
最近时间不太够openjudge上的题目没怎么做,最近要抓紧了,快提交了
之前加入acm社团时候学长也说过,做好全部课余时间投入的准备,现在有点感触,有些累,但是充实,希望能够坚持下去,加油,相信自己一定能行!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅梦曾倾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值