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

poj3069Saruman's Army(贪心)

热度:64   发布时间:2023-12-11 20:49:36.0

题意

直线上有一些点。现在能给一部分点加buff,加了buff的点能影响到周围r的范围内的点。问最少要给多少点加buff才能影响到所有的点

思路

典型的贪心,每次尽量找能影响到当前的最靠右的点来加buff,加完之后继续从加了buff的那个点影响范围之外的第一个点开始继续找

代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int kMaxn = 1000 + 5;
int x[kMaxn];int main() {int r,n;while(scanf("%d %d", &r, &n)) {if(r == -1 && n == -1)break;for(int i = 0; i < n; i++) {scanf("%d", &x[i]);}sort(x, x + n);int sum = 0;x[n] = 0x3f3f3f3f;for(int i = 0; i < n; i++) {int j = i;while(j < n && x[j] - r <= x[i]) j++;j--;//printf("%d %d\n", x[i], x[j]);while(i < n && x[i] <= x[j] + r) i++;i--;sum++;}printf("%d\n", sum);}return 0;
}