问题描述:设x2,x2,....,xn是实直线上的N个点。用固定长度的闭区间覆盖着n个点,至少需要多少个这样的长度闭区间?设计解决此问题的有效算法。
算法设计:对于给定的实直线上的n个点和闭区间的长度k,计算覆盖点集的最少区间数。
数据输入:第一行有两个整数n和k,表示有n个点,且固定长度闭区间的长度为k。接下来一行中有n个整数,表示n个点在实直线上的坐标(可能相同)
结果输出:将计算的最少区间数输出
代码:
#include<stdio.h>
void sort(int a[],int n);
int cover(int a[],int n,int k);
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int a[100];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("%d",cover(a,n,k));
return 0;
}
void sort(int a[],int n)
{
for(int i=0;i<n;i++)
{
int min=i;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[min])
min=j;
}
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
int cover(int a[],int n,int k)
{
sort(a,n);
int sum=0;//用于记录区间个数
int t=0; //用于标记已被覆盖的点序号
int start=0;
while(t<n)
{
printf("NO.%d: ",sum+1);
for(t;a[t]<=a[start]+k && t<n;t++)
{
printf("%d ",a[t]);
}
printf("\n");
start=t;
sum++;
}
return sum;
}
运行截图: