POJ 3069 Saruman's Army (貪心)
阿新 • • 發佈:2017-07-16
依次 至少 一個 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> #includeView Code<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; }
POJ 3069 Saruman's Army (貪心)