问题解析:给出数轴上的一些点代表可放置的位置,给出装置的覆盖范围(覆盖的半径),求出最少用多少个装置能把所有给出的位置全部覆盖..........
贪心问题
从一个未覆盖的位置向前遍历,找到满足距离小于 r 的最右边的点,这个点一定作为一个装置的放置位置,然后从这个位置找到右边的最小的不能覆盖到的位置,这个位置作为下一次的起点...循环下去,直到所有的点都被覆盖到
- include<stdio.h>
- #include<algorithm>
- using namespace std;
- int n,r,x[1005];
- void slove()
- {
- int i=0,cnt=0;
- sort(x,x+n);//先排序
- while(i<n)
- {
- int bg=x[i++];//最左边的没有覆盖的点
- while(i<n&&x[i]<=bg+r)//被覆盖......
- {
- ++i;
- }
- int st=x[i-1];//最右边的未被覆盖的区域
- while(i<n&&x[i]<=st+r)//右边被覆盖区域
- {
- ++i;
- }
- ++cnt;//计数
- }
- printf("%d\n",cnt);
- }
- int main()
- {
- while(scanf("%d%d",&r,&n),r!=-1&&n!=-1)
- {
- for(int i=0;i<n;++i)
- {
- scanf("%d",x+i);
- }
- slove();
- }
- return 0;
- }