题目译自 BalticOI 2015 Day1 Bowling(BOW),原题面见附加文件。
如欲转载翻译,请注明翻译者信息及转载出处。
Byteasar 是一个保龄球迷,也是个数据迷。他记录下了一些过去保龄球比赛的结果。不幸的是,一些记录中的字符被污损了,因此看不清。Byteasar 请你写一个程序来计算与他的记录相符的不同比赛数目。
保龄球规则
一场保龄球比赛有 $n$ 局(frame):$n-1$ 局普通局和一局最终局。在一个典型的比赛中 $n=10$。在每局比赛最初,有 $10$ 个保龄球瓶正立放在球道末端,并且一个选手有不多于 $2$ 次(最终局有 $3$ 次)掷球机会(shots)去尽可能击倒更多数目的保龄球瓶。每局比赛被 $2$ 个(对于普通局)或 $3$ 个(对于最终局)字符表示。
对于每次投掷,选手会获得与他击倒保龄球瓶总数相等的基础分(basic points)。每局选手获得的基础分是这局内每一次投掷获得基础分的和。如果在一个普通局中 $10$ 个球瓶均被击倒(因此获得了 $10$ 分基础分),这个选手会获得奖励分(bonus points)。
对于一个普通局,规则如下:
- 如果一个选手在一局的第一次投掷后击倒了所有 $10$ 个球瓶,就称他全中(strike),并且这局比赛结束。下两次投掷获得的基础分的和将作为他的奖励分。一次全中记为 x- ;
- 如果一个选手用了一局中的两次投掷机会击倒了所有球瓶,就称他补中(spare)。下一次投掷获得的基础分将作为他的奖励分。一次补中记为 A/,其中 $A$ 是一个数字,描述他本局中第一次投掷击倒的球瓶数目;
- 如果两次投掷后击倒的球瓶数不多于 $9$,这个选手只获得基础分,这样的一局被记为 AB,其中 $A$ 表示本局中第一次投掷击倒球瓶数,$B$ 表示本局中第二次投掷击倒球瓶数($A+B\lt 10$)。
注意奖励分只包含在获得全中或补中的局中,忽略奖励分取决于下一局中投掷的事实。
最终局的规则如下:
- 在本局,选手最初有两次投掷机会。如果前两次投掷击倒的球瓶数不多于 $9$,这局比赛结束。否则(如果头两次投掷是一个补中或第一次投掷是一个全中),在本局,这个选手将获得第三次投掷的机会。每当这三次投掷中哪一次击倒了全部球瓶,下一次投掷时球瓶就会恢复初始状态。最终局的得分是击倒球瓶的数目和(注意最终局没有因补中或全中获得的奖励分);
- 总的说来,最终局共有以下 $7$ 种可能的比赛结果($A$ 和 $B$ 表示一个一位的数字):
| 标记 |
说明 |
得分 |
xxx |
三次连续的全中 |
$30$ |
xxA |
两次连续的全中,最后一掷击倒 $A$ 个球瓶 |
$20+A$ |
xA/ |
一次全中,然后是一次补中,第二掷击倒 $A$ 个球瓶 |
$20$ |
xAB |
一次全中,接下来两掷分别击倒 $A$ 和 $B$ 个球瓶($A+B\lt 10$) |
$10+A+B$ |
A/x |
一次补中,第一次击倒 $A$ 个球瓶,然后一次全中 |
$20$ |
A/B |
一次补中,第一次击倒 $A$ 个球瓶,第三掷击倒 $B$ 个球瓶 |
$10+B$ |
AB- |
两掷分别击倒 $A$ 和 $B$ 个球瓶($A+B\lt 10$) |
$A+B$ |
每一次比赛被一个长为 $2n+1$ 的字符串描述。在比赛最后每局的得分才可被计算。例如,对于一次 $n=10$ 的比赛,用 08x-7/2/x-x-23441/0/x 描述,选手每局的得分和总分如下:
| 局数 |
标记 |
基础分 |
奖励分 |
本局得分 |
累计得分 |
| $1$ |
08 |
$0+8$ |
— |
$8$ |
$8$ |
| $2$ |
x- |
$10$ |
$7+3$ |
$20$ |
$28$ |
| $3$ |
7/ |
$7+3$ |
$2$ |
$12$ |
$40$ |
| $4$ |
2/ |
$2+8$ |
$10$ |
$20$ |
$60$ |
| $5$ |
x- |
$10$ |
$10+2$ |
$22$ |
$82$ |
| $6$ |
x- |
$10$ |
$2+3$ |
$15$ |
$97$ |
| $7$ |
23 |
$2+3$ |
— |
$5$ |
$102$ |
| $8$ |
44 |
$4+4$ |
— |
$8$ |
$110$ |
| $9$ |
1/ |
$1+9$ |
$0$ |
$10$ |
$120$ |
| final |
0/x |
$0+10+10$ |
— |
$20$ |
$140$ |