【模板】 区间覆盖最小长度

传送门

题解

\(i\)来表示\(x\)坐标轴上坐标为\([i-1,i]\)的长度为\(1\)的区间,并表示\(n(1\leq n\leq 200)\)个不同的整数,表示\(n\)个这样的区间。
现在要求画\(m\)条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,

数据范围

线段的数量不超过\(m(1\leq m\leq 50)\)

题解

初始即所有线段的覆盖长度,最后求出来所有缝隙,减去最大的\(m\)个缝隙

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define l first
#define r second 
typedef pair<int,int> pii;
const int N=210;
int n,m;
int ed[N],gap[N];
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        rep(i,0,n) scanf("%d",&ed[i]);
        sort(ed,ed+n);
        int ans=ed[n-1]-ed[0]+1;
        rep(i,0,n-1) gap[i]=ed[i+1]-1-ed[i];
        sort(gap,gap+n-1);
        int res=0;
        m-=1;
        for(int i=n-2;m;i--,m--)
            res+=gap[i];
        printf("%d\n",ans-res);
    }
}
posted @ 2020-06-19 14:13  Hyx'  阅读(221)  评论(0)    收藏  举报