栈和表达式题目讲解2

1.山峰

题目:

Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。每个山峰的高度都是不一样的。编号为i的山峰高度为\(h_i\)

小修从西往东登山。每到一座山峰,她就回头观望自己走过的艰辛历程。在第i座山峰,她记录下自己回头能看到的山峰数\(s_i\)

何谓“能看到”?如果在第i座山峰,存在\(j<k<i,h_j<h_k\),那么第j座山峰就是不可见的。除了不可见的山峰,其余的山峰都是可见的。

回家之后,小修把所有的\(s_i\)加起来得到S作为她此次旅行快乐值。现在n座山峰的高度都提供给你了,你能计算出小修的快乐值吗?

题目条件:

1.\(1<=n<=15000\)
2.第\(i+1\)行输入一个整数\(h_i\)\(h_i\)<=\(10^9\)

分析:

我们要维持一个单调递减的栈,i从1开始每次放入第第i座山峰的高度,并依次比较,删除高度小于\(h_i\)的山峰,每次答案就加上此时栈内的元素个数。

2.接龙游戏

题目:

给出了N个单词,如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
你的任务是:对于输入的单词,找出最长的龙。

题目条件:

1.\(1<=N<=10^5\)
2.输入数据已按照长度从小到大排序,每个单词长度小于50。

分析:

由于要让上一个单词为下一个单词的前缀,我们只需要按字典序排序,保证以一个单词为开头时一定会得到最优情况,并且每次需要记录下最优答案。还有每次单词进栈是要与原来栈顶的单词进行比较,程序已经在开头记录了最优答案,只需要把栈里所有不是新加入单词的前缀单词删除即可。

posted @ 2026-07-03 14:02  zhhhanry  阅读(0)  评论(0)    收藏  举报