题目
源地址:
http://poj.org/problem?id=3069
理解
每一个点有自己的范围,要求所有的点都被覆盖。 一开始的解法就是贪心,从最左边开始考虑,距离这个点r以内的区域内一定要有被标记的点(包括自身),只要不断的叠加上去就OK。 后来自己想过另外一种解法,每个点的区域都进行标记,一旦两个点有重叠的部分,则意味着有一个点是多余的。不过计算之后感觉时间复杂度有点高,可能达到了O(N^3)的级别,就没有继续向下去。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug puts("-----")
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf (1<<28)
using namespace std;
#define MAXN 1001
int point[MAXN];
int r, n;
int cover[MAXN];
void init()
{
memset(point, 0, sizeof(point));
memset(cover, 0, sizeof(cover));
for (int i = 0; i < n; i++) cin >> point[i];
sort(point, point + n);
}
int main(int argc, char const *argv[])
{
while (cin >> r >> n && r != -1 && n != -1)
{
init();
int i = 0, ans = 0;
while (i < n)
{
int s = point[i++];
while (i < n && point[i] <= s + r) i++;
int p = point[i - 1];
while (i < n && point[i] <= p + r) i++;
ans++;
}
printf("%d\n", ans);
}
return 0;
}
更新日志
- 2014年08月25日 已AC。