当前位置: 代码迷 >> 综合 >> POJ3069 Saruman's Army(贪心)
  详细解决方案

POJ3069 Saruman's Army(贪心)

热度:94   发布时间:2023-11-08 17:06:11.0

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;
}