Day 2 B - Balanced Sequence HDU 6299 | 贪心

想到前后缀表达式那里处理括号要借助栈,处理了每个串自身内部可以成对的括号。但是由这一点,最初考虑的是,先把自身内部的处理了(除去首尾)再比较首尾的括号是和自身内部的匹配更优,还是与其他首尾匹配更优。但是一个是比较的过程不好记录,另一个是与其他首尾比较,没法像自身内部一样用栈(因为顺序是可以移动的),所以就卡住了。

看了题解发现是贪心,我们其实不需要考虑首尾的括号究竟怎么处理。只要先把自己内部的能消的消去,剩下的串就是))),(((,)))((三种。对于前两种就直接加到totalright, totalleft就好,第三种要考虑怎么放置可以与前两种消掉最多。

这里最开始我的想法是,对第三种跟前两种一样处理,直接加到totalright, totalleft中,最后比较两个total哪个小,就取哪个。但是这个贪心的策略是错的。
像这种情况:

))))((((
)))))))(((
))(((((((
))))((

我们手动移动一下最后是这样:

)))((

也就是说,就算我们可以随便改变字符串的连接顺序,也是可能会存在不能用尽所有括号的情况,而上面的贪心是建立在所有括号都可以用尽的基础上的。

问题就出在对第二种串的处理上,不能认为第二种串所有的括号都可以派上用途。试几种情况可以发现,因为我们是按(优先的顺序(正规括号),所以要舍去top.right end.left,即这两个值不计入totall, totalr。

之后就是上手写,写的时候遇到了一些问题,总结一下经验:

  • 对相同变量(比如控制循环的i)进行观察,在一次循环里多次输出的时候,做一点标记区分。
  • 遇到ACCESS_VIOLATION,如果用的是向量,可以通过 vec. at(xx)辅助检查,如果越界会弹出异常(相当于vec[xx])
  • 向量的最后一个元素的访问,可以直接使用vec. back(),删除最后一个元素,直接使用vec. pop_back()即可
  • 找倒数第二个元素的时候,p <= sec.end()-2,而不是<
  • typedef struct nodxy{int x; int y;} nod,后面声明结构体变量可以直接nod a;c++中也可以直接 struct nod {int x; int y;},后面用struct nod a声明变量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值