您的位置:首页 > 其它

POJ3069 Saruman's Army(贪心)

2017-09-03 17:13 239 查看
POJ3069

描述:

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

分析:

首先从最左边开始考虑,显然,从左边起,标记的第一个点,在最左边点的右侧。且选择距离R内 距离其最远的点。

接着,把上一次标记的这个点 能影响的最右边的点 的下一个点,作为最左边的点,开始又一次标记。

注:挑战程序竞赛p45

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 10010
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: