#joi2018hoa. [joi2018ho_a]ストーブ (Stove)
[joi2018ho_a]ストーブ (Stove)
JOI 君的房间
JOI 君的房间里有一个火炉。由于 JOI 君自己很能忍受寒冷,所以在独自一人的时候不需要开火炉。但是当有客人来访时,就需要开火炉。
今天,JOI 君的房间里有 N 个客人。第 i 个(1 ≤ i ≤ N)客人在时刻 Ti 到达,并在时刻 Ti + 1 离开。不会同时有多个客人。
JOI 君可以在任意时间开关火炉。但是,每次打开火炉都要消耗一根火柴。由于 JOI 君只有 K 根火柴,所以最多只能打开 K 次火炉。一天开始时,火炉是熄灭的。
开着火炉会消耗相应的燃料,所以需要恰当地确定开关火炉的时间,以最小化火炉开启的总时间。
任务
给定 JOI 君房间里客人的信息以及 JOI 君拥有的火柴数量,求火炉开启的总时间的最小值。
输入
从标准输入中读取以下输入:
- 第 1 行包含两个整数 N, K,以空格分隔。表示 JOI 君的房间里有 N 个客人,JOI 君有 K 根火柴。
- 接下来的 N 行中的第 i 行(1 ≤ i ≤ N)包含整数 Ti。表示第 i 个客人在时刻 Ti 到达并在时刻 Ti + 1 离开。
输出
将最小的火炉开启时间总和作为一行输出到标准输出中。
限制
所有输入数据满足以下条件:
- 1 ≤ N ≤ 100,000。
- 1 ≤ K ≤ N。
- 1 ≤ Ti ≤ 1,000,000,000 (1 ≤ i ≤ N)。
- Ti < Ti+1 (1 ≤ i ≤ N - 1)。
子任务
子任务 1 [20 分]
满足以下条件:
- N ≤ 20。
- 1 ≤ Ti ≤ 20 (1 ≤ i ≤ N)。
子任务 2 [30 分]
满足 N ≤ 5,000。
子任务 3 [50 分]
没有额外的限制。
示例输入 1
3 2
1
3
6
示例输出 1
4
在这个示例输入中,JOI 君的房间里有 3 个客人。按照以下方式打开和关闭火炉,客人到访时火炉是开着的,需要开火炉的次数为 2 次,总的火炉开启时间为(4 - 1)+ (7 - 6)= 4。
- 在第一个客人到达时间为 1 时打开火炉。
- 在第二个客人离开时间为 4 时关闭火炉。
- 在第三个客人到达时间为 6 时打开火炉。
- 在第三个客人离开时间为 7 时关闭火炉。
无法使总的火炉开启时间小于 4,因此答案为 4。
示例输入 2
3 1
1
2
6
示例输出 2
6
在这个示例输入中,JOI 君只能打开一次火炉,所以需要在第一个客人到达时间为 1 时打开火炉,在第三个客人离开时间为 7 时关闭火炉。
请注意,客人离开时间和下一个客人到达时间可能是一样的。
示例输入 3
3 3
1
3
6
示例输出 3
3
在这个示例输入中,JOI 君需要在每个客人到达时打开火炉,并在每个客人离开时关闭火炉。
示例输入 4
10 5
1
2
5
6
8
11
13
15
16
20
示例输出 4
12