【模板】 区间覆盖最小长度
传送门
题解
用\(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);
}
}

浙公网安备 33010602011771号