题目描述
由于长期没有得到维修,A国的高速公路上出现了N个坑。为了尽快填补好这N个坑,A国决定对M处地段采取交通管制。为了求解方便,假设A国的高速公路只有一条,而且是笔直的。现在给出N个坑的位置,请你计算,最少要对多远的路段实施交通管制?
输入格式
输入数据共两行,第一行为两个正整数N、M (2<=N<=15000,M<=N)。第二行给出了N个坑的坐标(坐标值均在长整范围内,按从小到大的顺序给出,且不会有两个点坐标相同)。
输出格式
仅一行,为最小长度和。
输入输出样例
输入 #1复制
18 4 3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
输出 #1复制
25
说明/提示
[样例说明]
交通管制的地段分别为:3-8,14-21,25-31,40-43。
主要思路:
一条路上N个坑,只能限制M段。
将相邻两坑之间的距离视为一个准封锁带,要想其值最小,就要想办法在可实现的有限的M个封锁带中尽可能去掉距离大的准封锁带;直白的讲就是在“两坑之间的距离”中删去m-1个最大值
代码部分:
import java.io.*;
import java.util.Arrays;
public class Main {
static StreamTokenizer r;
static PrintWriter pr;
static BufferedReader re;
static {
r = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
pr = new PrintWriter(new OutputStreamWriter(System.out));
re = new BufferedReader(new InputStreamReader(System.in));
}
public static void main(String[] args) throws IOException {
int n = ini();//n个坑
int m = ini();//m个管制地方
int ans;//坑之间距离和
int a[] = new int[n];//记录坑坐标的数组
int dis[] = new int[n];//记录坑间距的数组
for (int i = 0; i < a.length; i++) {
a[i] = ini();
}
for (int i = 0; i < dis.length - 1; i++) {
dis[i] = a[i + 1] - a[i];
}
ans = a[n - 1] - a[0] + 1;
Arrays.sort(dis);//将距离排序
for (int i = n - 1; i > n - m; i--) {//由大到小,依次消去共计m-1个最大坑距离,剩下的就是最短封闭路距
ans = ans - dis[i] + 1;//注意这里要+1,因为每个坐标都代表一段;例如3-8段,其实际包含长度是6,而非8-3
}
System.out.println(ans);
}
static int ini() throws IOException {
r.nextToken();
return (int) r.nval;
}
static long Long() throws IOException {
r.nextToken();
return (long) r.nval;
}
}