POJ3069 Saruman's Army(贪心)

来源:互联网 发布:js引用高德地图 编辑:程序博客网 时间:2024/05/22 11:03

POJ3069
描述:
在街道上有n个点,在这些点上放置路灯,告诉你路灯的照射范围为R,求最少放置多少路灯能照亮所有的点。运用贪心即可:从最左边的点开始,找到这个点向右范围R以内的最远能到达的点,在这里设置路灯,然后前进到大于R的点(跳过右边路灯能覆盖到的范围),剩下的部分也照此处理。

分析:
首先从最左边开始考虑,显然,从左边起,标记的第一个点,在最左边点的右侧。且选择距离R内 距离其最远的点。
接着,把上一次标记的这个点 能影响的最右边的点 的下一个点,作为最左边的点,开始又一次标记。
注:挑战程序竞赛p45

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define maxn 10010int N,R,i;int a[maxn];int main(){    cin>>N>>R;    for(i=0;i<N;i++)        cin>>a[i];    sort(a,a+N);    int i=0,ans=0;    while(i<N){        //s是没有被覆盖的最左的位置        int s=a[i++];        //一直向右前进直到距s的距离大于R的点        while(i<N &&a[i]<=s+R) i++;        //p是新加上标记的点的位置        int p=a[i-1];        //一直向右前进距p的距离大于R的点        while(i<N &&a[i]<=p+R) i++;        ans++;    }    cout<<ans<<endl;    return 0;}
原创粉丝点击