6199: LCYZ的道路
时间限制: 1 Sec 内存限制: 128 MB提交: 78 解决: 51
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
由于在修新教学楼,LCYZ的路上出现了N个坑。为了尽快填补好这N个坑,LCYZ决定对M处地段采取封闭措施。为了求解方便,假设LCYZ的路只有一条,而且是笔直的。现在给出N个坑的位置,请你计算,最少要对多远的路段采取封闭措施?
输入
输入数据共两行,第一行为两个正整数N、M (2<=N<=15000,M<=N)。第二行给出了N个坑的坐标(坐标值均在int范围内,按从小到大的顺序给出,且不会有两个点坐标相同)。
输出
仅一行,为最小长度和。
样例输入
18 4
3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
样例输出
25
提示
采取封闭措施的地段分别为:3-8,14-21,25-31,40-43。
根据最优子结构,应该选择前M-1个差值最大的空 来分割成M个区间
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node{
int xx, index;
}x[15005];
bool cmp(node a, node b)
{
return a.xx>b.xx;
}
int main()
{
int m, n, a[15005], mm[15005];
mm[0]=0;
scanf("%d%d%d", &n, &m, &a[0]);
mm[m]=n;
for(int i=1;i<n;i++)
{
scanf("%d", &a[i]);
x[i].xx=a[i]-a[i-1];
x[i].index=i;
}
sort(x, x+n, cmp);
int ans=0;
for(int i=0;i<m-1;i++)
mm[i+1]=x[i].index;
sort(mm, mm+m+1);
for(int i=1;i<m+1;i++)
ans+=a[mm[i]-1]-a[mm[i-1]]+1;
printf("%d\n", ans);
return 0;
}
/**************************************************************
Problem: 6199
User: ldu_reserver201701
Language: C++
Result: 正确
Time:12 ms
Memory:1212 kb
****************************************************************/