求解区间覆盖问题(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
#define MAX 20
#include <stdio.h>
int manage(int[],int,int);
void quicksort(int[],int,int);
int partition(int[],int,int);
int main() {
int n,x,a[MAX];
scanf("%d %d",&n,&x);
int i;
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
}
quicksort(a, 0, n-1);
for(i=0; i<n; i++) {
printf("%d ",a[i]);
}
printf("\n");
int w;
w = manage(a,n,x);
printf("%d",w);
return 0;
}
void quicksort(int s[],int first,int end) {
int pivot;
if(first < end) {
pivot = partition(s,first,end);
quicksort(s,first,pivot-1);
quicksort(s,pivot+1, end);
}
}
int partition(int f[],int first,int end) {
int i = first, j = end;
while(i < j) {
while(i < j && f[i] <= f[j]) {
j--;
}
if(i < j) {
int temp1 = f[i];
f[i] = f[j];
f[j] = temp1;
i++;
}
while(i < j && f[i] <= f[j]) {
i++;
}
if(i < j) {
int temp1 = f[i];
f[i] = f[j];
f[j] = temp1;
j--;
}
}
return i;
}
int manage(int a[],int n,int d) {
int i,j=0;
int count = 1;
int x[MAX],y[MAX];
x[0] = a[0];
y[0] = x[0] + d;
for( i=1; i<n; i++) {
if( a[i] > y[j] ) {
j++;
count++;
x[j] = a[i];
y[j] = x[j] + d;
}
}
return count;
}