P2242 公路维修问题
题目描述
由于长期没有得到维修,A 国的高速公路上出现了 nnn 个坑。为了尽快填补好这 nnn 个坑,A 国决定对 mmm 处地段采取交通管制。为了求解方便,假设 A 国的高速公路只有一条,而且是笔直的。现在给出 nnn 个坑的位置,请你计算,最少要对多远的路段实施交通管制?
输入格式
输入数据共两行,第一行为两个正整数 n,m(2≤m≤n≤15000)n, m(2\le m \le n\le 15000)n,m(2≤m≤n≤15000)。第二行给出了 nnn 个坑的坐标(坐标值均在长整范围内,按从小到大的顺序给出,且不会有两个点坐标相同)。
输出格式
仅一行,为最小长度和。
输入输出样例 #1
输入 #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−433-8,14-21,25-31,40-433−8,14−21,25−31,40−43。
题解:这个题一开始我觉得有点不好下手,因为我不知道怎么去判断这个路段应该到哪里结束才是最优解,所以我就反向解决。先把这条路段的距离算出来,然后计算两个相邻坑的距离,只需要对这个距离进行降序排序,把距离较大的减去,这里一共要有m段,那么就需要减去m-1个较大距离就能实现。
AC代码:
cpp
#include <bits/stdc++.h>
using namespace std;
long long n,m,a[15010],b[15010],ans,cnt;
bool cmp(int x,int y){
if(x > y){
return true;
}else{
return false;
}
}
int main(){
cin>>n>>m;
for(int i = 1; i <= n; i++){
cin>>a[i];
}
//路段总长度,首尾都算的情况下要+1
ans = a[n] - a[1] + 1;
//计算两个点之间的距离
for(int i = 1; i < n; i++){
b[i] = a[i+1] - a[i];
}
sort(b+1,b+n,cmp);//对相邻两个点的距离进行降序排序
//m处路段 需要m-1次分割,前m-1个距离是不需要的
for(int i = 1; i < m; i++){
ans = ans - b[i] + 1;
}
cout<<ans<<endl;
return 0;
}