贪心 点最大覆盖问题
排序 从小到大排序
从第一个点A1 向右扩展R
然后找出这个范围内 最靠左的点 把他标记 把这个点写作A2
最后以A2向右扩展,找到出界的第一个点,记作A3,
从A3开始向右扩展R
然后找出这个范围内最靠左的点 把他标记 把这个店写作A4
最后以A4向右扩展,找到出界的第一个点,记作A5,
..................................................
.................................................
所有的点遍历完。
#include"iostream"
#include"algorithm"
using namespace std;
int main()
{
int R,n;
while(cin>>R>>n)
{
if(R==-1&&n==-1) break;
int a[2000];
for(int i=0;i<n;i++)
scanf("%d",a+i);
sort(a,a+n);
int ans=0;
for(int i=0;i<n;)
{
int t=a[i]+R; //当前点向右扩展 R
int j=i;
while(a[j]<=t&&j<n) //找出这个范围内最靠右的点,这个点不能出界
j++;
ans++; //标记一次
j--; //j是比找到点的位置超前一个的。
t=a[j]+R;
while(a[j]<=t&&j<n) //然后从标记位置向右继续扩展 找到出界的第一个点,从这个点开始循环 然后向右扩展R找到最靠右的点标记...
j++;
i=j;
}
cout<<ans<<endl;
}
return 0;
}