/** * 区间覆盖问题: 要求给定一组已经排好序数字,每个数字代表一个以其为起点的单位区间。 * 然后给定一个区间长度L, 要求能够覆盖到最多的单位区间,并且整个长度不超过L。 * 同时给出覆盖了哪些区间。比如L=5,{1,2,7,10,11,12,14,20,22,23}, * 能够覆盖最多10,11,12,14四个区间,覆盖长度长度为5 <= L。 */ #include <stdio.h> #define M 10 //单位区间数目 #define L 5 //区间长度 int a[M] = {1,2,7,10,11,12,14,20,22,23}; //排好序的数字(单位区间) /** * 返回最大能够括住的区间数目,要求括住的长度不超过L */ int find_maxLeval(){ int begin,end; int gap_num,gap_v; int max_leval_num = 0; int l,r; //使用两个指针,分别指向括住的区间的首尾 begin = end = 0; while(end < M){ gap_num = end - begin + 1; //括住的区间数目 gap_v = a[end] - a[begin] + 1; //括住的区间长度 if(gap_v > L){ //如果长度超过了L,则向前移动begin指针 while(gap_v > L){ begin++; gap_num = end - begin + 1; gap_v = a[end] - a[begin] + 1; } } else{ //如果长度未超过L,则看是否需要更新括住的区间数目 if(gap_num > max_leval_num){ max_leval_num = gap_num; //更新括住的区间数目 l = begin; //更新首指针 r = end; //更新尾指针 } } end++; } printf("l=%d,r=%d\n",l,r); return max_leval_num; } int main(){ int max; max = find_maxLeval(); printf("max=%d\n",max); return 0; }
运行结果: