您的位置:首页 > 其它

poj 3069

2015-04-02 22:38 190 查看
/*

直线上有N个点,点x的位置是xi(距最左端),现在要加上标记

对于每个点,要求是在一个为R的圆的范围内需要一个点被标记

问最少需要标记多少个点

算法设计: 贪心算法设计

从左端第一点开始,距离其最远的不超过R的那个点加上标记,然后将那个

被标记的点当作第一个点,向后找那个距离其最远的不超过R的那个点,然后

加上标记,一直这样做下去直到覆盖了所有的电

*/

#include<iostream>
#include<algorithm>
#define max_n 1001
using namespace std;
int R, N;
int x[max_n];
void solve()
{
sort(x, x + N);
int s = 0, ans = 0;
while (s < N){
//d是没有被覆盖到的最左边的点
int d = x[s++];
//一直向右走直到距s的距离大于了R
while (s < N&&x[s] <= d + R) s++;
//m是新加上标记的点的位置
int m = x[s - 1];
//一直向右前进直到距离p的距离大于R
while (s < N&&x[s] <= m + R) s++;
ans++;
}
cout << ans << endl;
}
int main()
{
while (cin >> R >> N){
if (R == -1 && N == -1){ break; }
int i;
for (i = 0; i < N; i++){
cin >> x[i];
}
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: