Description
给一个数组,在数组上取若干个点,取得每一个点周围距离为R的点,算覆盖, 求最小要取多少个点
Algorithm
首先找个开头,然后从这个点往后距离R,看到哪儿,标记这个点,然后再从这个点往后,再找,这些点也都可以覆盖。然后从新的开头开始。前面这一堆,就归这个标记的点管了
Code
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2000;
int main()
{
for (;;)
{
int r, n;
scanf("%d%d", &r, &n);
if (r==-1 && n==-1) break;
int a[maxn]={0};
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 first = a[i];
i++;
while (i<n && a[i]<=first+r) i++;
int marked = a[i-1];
while (i<n && a[i]<=marked+r) i++;
ans++;
}
printf("%d\n", ans);
}
return 0;
}
收获
会用了sort函数