POJ 3069 Saruman's Army
阿新 • • 發佈:2018-12-17
題意:給了一列點,每個點周圍不超過R舉例內一定有一個被標記的點,求最少被標記的點的個數。
分析:貪心,從起始位置開始,每次找右邊不超過R的最遠的位置,然後延伸R的距離,每個點負責的範圍就是周圍R的距離
程式碼:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn = 2010; int pos[maxn]; int main() { int r,n; while(~scanf("%d%d",&r,&n)) { if(r == -1 && n == -1) break; for(int i = 1; i <= n; i++) scanf("%d",&pos[i]); sort(pos + 1,pos + n + 1); int ans = 0; int j = 1; while(j <= n) { int st_pos = pos[j++]; while(j <= n && pos[j] - st_pos <= r)j++; int mark_pos = j - 1; ans++; while(j <= n && pos[j] - pos[mark_pos] <= r)j++; } cout<<ans<<endl; } return 0; }