P3470 [POI 2008] BBB-BBB

题目描述

Byteasar 在 Byteotian Bit Bank(简称 BBB)有一个账户。 一开始账户里有 $p$ 个 bythaler,最后有 $q$ 个 bythaler。 每笔交易要么是存入一个 bythaler,要么是取出一个 bythaler。 账户余额从未为负。 一位银行柜员准备了一份银行对账单:一条纸带,上面有一系列的加号和减号(加号表示存入一个 bythaler,减号表示取出一个 bythaler)。 很快发现,有些交易记录不正确。 银行柜员不能打印另一份对账单,但必须修改已经打印的那一份。 对账单不必与事实一致,只要交易序列满足以下两个条件即可: 最终余额与初始余额和对账单中的交易序列一致,根据对账单中的交易序列,账户余额从未为负。 你需要计算银行柜员需要多少最少时间来修正对账单。 银行柜员可以: - 在 $x$ 秒内将任意选择的交易变为其相反的交易,或者 - 在 $y$ 秒内将最后一笔交易移到对账单的开头。 例如,如果 $p=2,q=3$,那么 `--++-+-++-+-+` 是一个正确的对账单。 另一方面,对账单 `---++++++` 是不正确的,因为账户余额在第三笔交易后会变为负数,而且最终余额应该是 3,而不是 5。 然而,可以通过将倒数第二个符号变为其相反的符号,并将最后一笔交易移到对账单的开头来修正。 ### 任务 编写一个程序: - 从标准输入中读取 Byteasar 账户的当前对账单(一个加号和减号的序列)以及数字 $p,q,x$ 和 $y$。 - 输出修正对账单所需的最少秒数,使得初始和最终余额一致,并且余额从未为负。

输入格式

第一行包含 5 个整数 $n,p,q,x$ 和 $y\ (1\le n\le 1\ 000\ 000$, $0\le p,q\le 1\ 000\ 000$, $1\le x,y\le 1000$),用单个空格分隔,分别表示: Byteasar 进行的交易数量、初始和最终账户余额、执行一次符号变更和将交易移到开头所需的秒数。 第二行包含一系列符号(每个是加号或减号),中间没有空格。

输出格式

输出的第一行和最后一行应包含一个整数,即修正对账单所需的最少秒数。如果不需要修正,则为零。 你可以假设每个测试数据都有一个适当的修改序列。

说明/提示

(由 ChatGPT 4o 翻译)