想到前后缀表达式那里处理括号要借助栈,处理了每个串自身内部可以成对的括号。但是由这一点,最初考虑的是,先把自身内部的处理了(除去首尾)再比较首尾的括号是和自身内部的匹配更优,还是与其他首尾匹配更优。但是一个是比较的过程不好记录,另一个是与其他首尾比较,没法像自身内部一样用栈(因为顺序是可以移动的),所以就卡住了。
看了题解发现是贪心,我们其实不需要考虑首尾的括号究竟怎么处理。只要先把自己内部的能消的消去,剩下的串就是))),(((,)))((三种。对于前两种就直接加到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声明变量。