POJ-3069-Saruman's Army

来源:互联网 发布:java编写迷宫小游戏 编辑:程序博客网 时间:2024/05/22 17:47

本题大意为:

在一个数轴上给定n个点的横坐标,每个点能以R为半径作圆覆盖周围,问最少需要多少个点能使这些点全部被覆盖住!


本题思路:

这个题,首先需要对所给的数据进行排序,然后才能继续操作!

以当前第一个未被覆盖的点设为begin,以该点作圆,向后寻找,直到找到第一个不能被覆盖的点,设为cnt,此时取其前面一个点的坐标即 cnt-1 ,然后就以此点zhong为中心作圆,继续向后查找,同样的直到找到第一个未被覆盖的点,同时将该点的坐标赋给begin,点数ans加1(因为zhong左边的已经确定了,所以只需要处理右边的就行了!)一直酱紫重复找,直到cnt大于n即可!


代码如下:(代码里关键步骤也是有注释的!)

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int main(){    int R,n;    int r[5204];    while(scanf("%d%d",&R,&n)!=EOF)    {        if(R==-1&&n==-1)            break;        for(int i=0; i<n; i++)            scanf("%d",&r[i]);        sort(r,r+n);        int ans=0;        int cnt=0;        while(cnt<n)        {            int begin=r[cnt++];//取当前灯!            while(cnt<n&&r[cnt]<=begin+R)            cnt++;//一直向里面找,找到能将前面的灯都给照亮的最远的灯!            int zhong=r[cnt-1];//找到中心点!            while(cnt<n&&r[cnt]<=zhong+R)            cnt++;//找出不超出R范围的最远距离!            ans++;//超出范围了表示就有一点已经无法再继续照亮更远的灯了,所以ans就加加了!        }        printf("%d\n",ans);    }    return 0;}


0 0