求解区间覆盖问题(20分)
题目内容:
设x1,x2,… ,xn是实直线上的n个点。用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间?设计求解此问题的有效算法。对于给定的实直线上的n个点和闭区间的长度k,编程计算覆盖点集的最少区间数。
输入格式:
输入数据的第一行有2个正整数n和k,表示有n个点,且固定长度闭区间的长度为k。接下来的1行中,有n个整数,表示n个点在实直线上的坐标(可能相同)。
输出格式:
将编程计算出的最少区间数输出。
输入样例:
7 3
1 2 3 4 5 -2 6
输出样例:
3
#include<cstdio>
#include<algorithm>
using namespace std;
int getNumber(int x[],int n,int k){
sort(x+1,x+n+1);
int number=0;
int i=1;
int m=x[1];
while(m<=x[n]){
if(m==x[n]) break;
number++;
m=x[i]+k;
for(;i<=n,x[i]<=m;i++);
}
return number;
}
int main(){
int n,k;
int x[10000];
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&x[i]);
}
printf("%d\n",getNumber(x,n,k));
return 0;
}