SP15736 BRKSTRNG - Breaking String
题目描述
某种字符串处理语言允许程序员将一个字符串切分成两部分。由于这涉及复制原字符串,因此将一个长度为 $n$ 的字符串切分为两部分需要消耗 $n$ 个单位的时间。假设程序员希望将一个字符串切分成许多段,切分的顺序会直接影响消耗的总时间。
例如,假设我们希望在一个长度为 20 的字符串的第 3、8 和 10 个字符之后进行切分(字符从左端开始从 1 递增编号)。如果按照从左到右的顺序切分:第一次切分消耗 20 个单位时间,第二次切分消耗 17 个单位时间,第三次切分消耗 12 个单位时间,总共消耗 49 个单位时间(参见下方示例)。如果按照从右到左的顺序切分:第一次切分消耗 20 个单位时间,第二次切分消耗 10 个单位时间,第三次切分消耗 8 个单位时间,总共消耗 38 个单位时间。
按从左到右顺序切分的代价:
```
thisisastringofchars (原字符串)
thi sisastringofchars (代价: 20 单位)
thi sisas tringofchars (代价: 17 单位)
thi sisas tr ingofchars (代价: 12 单位)
总计: 49 单位
```
按从右到左顺序切分的代价:
```
thisisastringofchars (原字符串)
thisisastr ingofchars (代价: 20 单位)
thisisas tr ingofchars (代价: 10 单位)
thi sisas tr ingofchars (代价: 8 单位)
总计: 38 单位
```
输入格式
包含多组测试数据。
对于每组测试数据:
* 第一行包含两个整数 $N$($2 \le N \le 10^7$)和 $M$($1 \le M \le 1000$,$ M < N$)。$N$ 表示字符串的原始长度,$M$ 表示切分的次数。
* 接下来的行包含 $M$ 个按升序排列的整数 $M_i$($1 \le M_i < N$),代表从字符串左端算起的切分位置。
读取输入直至文件结束(EOF)。测试数据不会超过 100 组。
输出格式
对于每组测试数据,单行输出完成所有切分所需的最小总代价。