贪心专练3 最小标记数问题

来源:互联网 发布:软件实施工资怎么样 编辑:程序博客网 时间:2024/06/05 00:46
题意:在一条直线上,有n个点。从这n个点中选择若干个,给他们加上标记。对于每一个点,其距离为R以内的区域里必须有一个被标记的点。问至少要有多少点被加上标记。
input:6   10    1 7 15 20 30 50
output:  3
————————————————————————————————————————————————————
思路:最优策略:在最左侧开始,往右找到最大R处接近R的地方标记,在此标记点处往右最大R处找到最大覆盖范围为一个周期。再从下一个未覆盖点开始重复该最优策略(即充分最大化R的覆盖区)
代码:
#include <stdio.h>int X[1000];int main(){    int N,R;    while(scanf("%d%d",&N,&R)!=EOF)    {        int i;        for(i=0; i<N; i++)            scanf("%d",&X[i]);        int k=0;        int cnt=0;        while(k<N)        {            int s=X[k++];//S用来记录当前位置同时把光标移动到下一位置            while(k<N&&X[k]<=s+R)k++;记录标记点左侧做大覆盖区            int p=X[k-1];标记点            while(k<N&&X[k]<=p+R)k++;记录标记点右侧最大覆盖区            cnt++;        }        printf("最少标记点数为: %d\n",cnt);    }    return 0;}

原创粉丝点击