/*
直线上有N个点,点x的位置是xi(距最左端),现在要加上标记
对于每个点,要求是在一个为R的圆的范围内需要一个点被标记
问最少需要标记多少个点
算法设计: 贪心算法设计
从左端第一点开始,距离其最远的不超过R的那个点加上标记,然后将那个
被标记的点当作第一个点,向后找那个距离其最远的不超过R的那个点,然后
加上标记,一直这样做下去直到覆盖了所有的电
*/
#include<iostream> #include<algorithm> #define max_n 1001 using namespace std; int R, N; int x[max_n]; void solve() { sort(x, x + N); int s = 0, ans = 0; while (s < N){ //d是没有被覆盖到的最左边的点 int d = x[s++]; //一直向右走直到距s的距离大于了R while (s < N&&x[s] <= d + R) s++; //m是新加上标记的点的位置 int m = x[s - 1]; //一直向右前进直到距离p的距离大于R while (s < N&&x[s] <= m + R) s++; ans++; } cout << ans << endl; } int main() { while (cin >> R >> N){ if (R == -1 && N == -1){ break; } int i; for (i = 0; i < N; i++){ cin >> x[i]; } solve(); } return 0; }
时间: 2024-10-29 10:46:36