按升序给定数轴上的n个点,给定一把长度为k的尺子,问尺子最多能覆盖几个点?
比如{1,3,7,8,9,11},用一把长度为4的尺子,从1开始量只能覆盖1和3两个点,覆盖不到7。从3开始量,能覆盖到3和7两个点。从7开始量可以覆盖四个点,所以答案为4
分析:可以从后面开始,依次减去前面相邻的,差值与给出的尺子长度比较,然后记录覆盖的点数,这样依次遍历完就找出最多的点数了
代码如下:
// [10/3/2013 qingezha]已知线段长度,求覆盖最多的点数,(一个有序数组代表各个点)
int calculate_num(int *arr,int length,int seg_len)
{
if(arr == NULL||length<=0 || seg_len<=0)
return 0;
int rear = length - 1;
int front = 0;
int max_num = 0;
while(rear>=0) //从最后一个点出发,依次减去前面的点的值,判断差值,然后记录点的个数
{
front = rear;
while(front>=0)
{
if((arr[rear]-arr[front])<=seg_len)
--front;
else //这里要记住,跳出循环
break;
}
//换成while((arr[rear]-arr[front])<=seg_len) 更简洁
max_num = rear-front > max_num ? rear - front : max_num; //这里三元操作运算符
--rear;
}
return max_num;
//
// int arr[5] = {1,2,5,6,9};
// cout<<calculate_num(arr,5,2);
//
}