1. 程式人生 > >POJ 3069 Saruman's Army (貪心)

POJ 3069 Saruman's Army (貪心)

依次 至少 一個 ide mage != cnblogs style man

題目大意:直線上有N個點,點i的位置是Xi,從這N個點中選取若幹,給他們加上標記,對每一個點,其距離為R以內的區域內必須有被標記的點。求至少需要多少個點被標記。

題目思路:設最左邊的點:點p的坐標為x,那麽離其距離為R的點的坐標為(x+R),我們應該標記的點應為坐標最接近且小於等於(x+R)的點p,則此時【x,p+R】範圍內點點均被標記。依次進行下去,直到包含所有點為止。

技術分享

技術分享
#include<stdio.h>
#include<queue>
#include<iostream>
#include<algorithm>
#include
<math.h> #include<string.h> #define INF 0x3f3f3f3f #define LL long long #define MOD 100000007 #define MAXSIZE 10005 using namespace std; int p[MAXSIZE]; int main() { int r,n; while(scanf("%d%d",&r,&n),r!=-1 && n!=-1) { for(int i=0;i<n;i++) scanf(
"%d",&p[i]); sort(p,p+n); int ans = 0; int pos1=0,pos2=0; while(pos1 < n) { int index = p[pos1] + r; pos2 = pos1; while(p[pos2] <= index) pos2++; ans++; index = p[pos2-1] + r; pos1
= pos2; while(p[pos1] <= index) pos1++; } printf("%d\n",ans); } return 0; }
View Code

POJ 3069 Saruman's Army (貪心)