POJ3069 Saruman's Army(贪心)
2017-09-03 17:13
239 查看
POJ3069
描述:
在街道上有n个点,在这些点上放置路灯,告诉你路灯的照射范围为R,求最少放置多少路灯能照亮所有的点。运用贪心即可:从最左边的点开始,找到这个点向右范围R以内的最远能到达的点,在这里设置路灯,然后前进到大于R的点(跳过右边路灯能覆盖到的范围),剩下的部分也照此处理。
分析:
首先从最左边开始考虑,显然,从左边起,标记的第一个点,在最左边点的右侧。且选择距离R内 距离其最远的点。
接着,把上一次标记的这个点 能影响的最右边的点 的下一个点,作为最左边的点,开始又一次标记。
注:挑战程序竞赛p45
描述:
在街道上有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; }
相关文章推荐
- poj3069 Saruman's Army 贪心
- poj3069 Saruman's Army(经典贪心)
- poj3069 Saruman's Army(贪心,水)
- POJ3069 Saruman's Army【贪心】
- poj3069 Saruman's Army 贪心
- POJ3069-贪心-Saruman's Army
- POJ 3069-Saruman's Army [贪心] 《挑战程序设计竞赛》2.2
- 【Poj】-3069-Saruman's Army(贪心)
- 【原创】【区间上的贪心 第三篇】Saruman's Army POJ 3069
- POJ 3069 Saruman's Army(贪心)
- POJ 3069 : Saruman\'s Army - 贪心
- Poj 3069 Saruman's Army【贪心】
- 贪心算法——字典序最小问题,Saruman‘s Army
- POJ 3069 Saruman's Army (贪心)
- POJ 3069 Saruman's Army(贪心)
- POJ3069 Saruman's Army
- POJ 3069 Saruman's Army(贪心+区间覆盖)
- POJ:3069 Saruman's Army(贪心)
- POJ 3069 Saruman's Army 贪心
- POJ 3069 Saruman's Army [贪心]