首先考虑第一个子段的左右边界,第一个物品必然是第一个子段的第一个物品,接下来确定第一个子段的最后一个物品的位置。
我们只需要第一个子段的得分大于等于 k 即可,往后遍历直到子段的得分大于等于 k ,确定了第一个子段的最后一个物品的位置。
接着从第一个子段最后一个物品的下一个位置开始确定第二个子段的左右边界,依次类推分割第三个、第四个...,此时必然可以分割出最多的子段。
需要注意的是,最后一个子段如果得分不足 k ,可以直接并入前一个子段。
有一个由若干物品组成的序列,物品类型用小写字母表示。该序列采用压缩格式给出:每个部分由一个小写字母和一个括号内的正整数构成,如 a(2) 表示连续两个类型为 a 的物品。整个序列由若干这样的部分拼接表示。注意:输入中相邻部分可能出现相同字母,这意味着这些相同类型的物品在序列中是整体连续出现的,分析时应将它们视为一个连续段。
现在需要将整个序列切分成若干个非空的连续子段(称为“包”),每个子段覆盖序列的一段连续区间,且所有子段恰好不重叠地覆盖整个序列。定义某个子段的得分为:该子段中的物品总数 乘以 该子段中出现的不同物品类型数量。
要求每个子段的得分至少为 K。求在满足条件的前提下,最多能切分出多少个子段。如果无论如何划分都无法使每个子段的得分均不小于 K,则认为无法完成,输出 −1。
约束条件:序列解码后的总长度 n 满足 1≤n≤1018,得分阈值 K 满足 1≤K≤1018。压缩字符串的长度不超过 106,保证格式合法,每个数字均是正整数,且所有数量之和等于 n。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.