贪心策略:每一次做标号的点应该是距离最左边的点最远且距离不超过R的点,标记好这个点后,下一段的最左边的点应该是第一个距离标记好的点距离大于R的点。
#include <stdio.h>
#include <algorithm>
using namespace std;
int arr[1010];
//升序比较函数
int cmp(const void *a, const void *b){
int *pa = (int*)a;
int *pb = (int*)b;
return *pa-*pb;
}
void solve(int n, int r){
int start_i, i, cnt, choose_i;
//快排一次
qsort(arr, n, sizeof(int), cmp);
start_i = 0;
cnt = 0;
while(1){
for(i=start_i; i<n; i++){
if(arr[i]-arr[start_i] > r)
break;
}
if(i < n){
cnt++;
choose_i = i-1;
//找下一个最左边的元素
for(i=choose_i+1; i<n; i++){
if(arr[i]-arr[choose_i] > r)
break;
}
if(i < n){
start_i = i;
continue;
}
else{
break;
}
}
else{
cnt++;
break;
}
}
printf("%d\n", cnt);
}
int main(void){
int r, n, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d %d", &r, &n), !(-1==r&&-1==n)){
for(i=0; i<n; i++) scanf("%d", arr+i);
solve(n, r);
}
return 0;
}