-
题目内容:
设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
c++
/*贪心法
从已给出的第一个点开始,以这个点为第一个闭区间的左端点,然后对后面的点进行判断,看是否落入该区间内。
如果在此区间内则判断下一个点,否则新增一个区间(以该点为左端点)。依此类推。
*/
#include<iostream>
using namespace std;
int main() {
int n, k; //点的个数、区间长度
cin >> n >> k;
int a[100];
for (int i = 0; i < n; i++)
cin >> a[i];
int judge[100] = { 0 }; //判断数组,取0表示该点还未被已经构造的区间覆盖,否则表示已被覆盖
int cnt = 0; //区间个数
for (int i =0 ; i < n; i++) {
if (judge[i] == 0) {
cnt++;
for (int j = i; j < n; j++) { //j不用从0开始,因为本身判断的时候便是根据下标顺序来的,判断第j点 时,前面j-1点肯定已经被覆盖
if ((a[j] <= a[i] + k) && (a[j]>a[i])) { //注意加上a[j]>a[i],这种情况表示a[j]在a[i]右边的情形。 如果a[j]<a[i]的话,那么前面的判断(a[j] <= a[i] + k)就 一定成立,而实际上a[j]并为被区间覆盖
judge[j] = 1; //不为0,表示被覆盖
}
}
}
}
cout << cnt << endl;
return 0;
}