关闭

poj 3069

155人阅读 评论(0) 收藏 举报
分类:

题目概述

数轴上有N个点,你需要以其中某些点为圆心做半径为R的圆,问最少做多少圆可使所有点都在圆中

时限

1000ms/3000ms

输入

第一行整数R,N,第二行N个整数,描述每个点的位置,输入到N=R=-1结束

限制

0<=R<=1000;1<=N<=1000

输出

每行一个数,为所求最少圆数

样例输入

0 3
10 20 20
10 7
70 30 1 7 15 20 50
-1 -1

样例输出

2
4

讨论

贪心,由于给的点是无序的,先排序,然后拿一个圆,依次以每个点为圆心试,确保第一个没有被以前的圆覆盖到的点能被现在的圆覆盖到,否则就将现在的圆固定,固定到最后一次可以确保时圆心的位置,在固定的一刻,这个圆也是一个以前的圆了,这样既保证所有点都在圆中,又是最少
从实现方面,则是维护左边界,然后枚举圆心,如果无法确保,则再看右边界最远可以到哪里,然后从下一个位置继续开始枚举圆心,枚举圆心时由于到达最后一个点后会退出循环导致结果不正确,故额外添加一个位置为正无穷的点作为最后一个点
其实道理是后来推出来的,一开始就靠直觉

题解状态

168K,16MS,C++,673B

题解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1004
#define memset0(a) memset(a,0,sizeof(a))

int R, N;
int nums[MAXN];
int fun()
{
    for (int p = 0; p < N; p++)
        scanf("%d", &nums[p]);//input
    nums[N++] = INF;
    sort(nums, nums + N);
    int left = 0, least = 0;//圆的左边界 需要的圆数
    for (int p = 0; p < N; p++)//枚举圆心
        if (nums[p] - R > nums[left]) {//当无法确保时
            least++;//额外的圆
            for (left = p; left < N&&nums[p - 1] + R >= nums[left]; left++);//枚举右边界
            p = left;//移动圆心枚举的起始位置
        }
    return least;
}
int main(void)
{
    //freopen("vs_cin.txt", "r", stdin);
    //freopen("vs_cout.txt", "w", stdout);

    while (~scanf("%d%d", &R, &N) && (N != -1 || R != -1))//input
        printf("%d\n", fun());//output
}
0
0
查看评论

poj3069Saruman's Army(贪心)

题意直线上有一些点。现在能给一部分点加buff,加了buff的点能影响到周围r的范围内的点。问最少要给多少点加buff才能影响到所有的点思路典型的贪心,每次尽量找能影响到当前的最靠右的点来加buff,加完之后继续从加了buff的那个点影响范围之外的第一个点开始继续找代码#include <cs...
  • readlnh
  • readlnh
  • 2016-08-18 00:52
  • 249

POJ-3069-Saruman's Army

这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内, 思路:贪心~尽量充分利用区间 代码: #include #include #include #include using namespace std; const int maxn=1100; ...
  • z309241990
  • z309241990
  • 2013-12-23 19:26
  • 1528

poj3069 贪心

题意:直线上有n个点,点i的位置是Xi。从这n个点中选择若干个,给它们加上标记。对每一个点,其距离为R以内的区域里必须有带标记的点(本身为带有标记的点,可以认为与其距离为0的地方有一个带有标记的点)。在满足这个条件的情况下,希望能为尽可能少的点添加标记。求最少要有多少个点被加上标记。 算法...
  • aidway
  • aidway
  • 2016-04-08 22:46
  • 311

POJ 3069 Saruman's Army(贪心)

Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5954 Accepted: 3037 Descri...
  • zwj1452267376
  • zwj1452267376
  • 2015-11-17 18:31
  • 448

poj 3069

#include #include int a[1010]; int cmp(int *a,int *b) { return *a-*b; } int main() { int R,n,i,j,k,count;; while(scanf("%d%d",...
  • wlwlxgg
  • wlwlxgg
  • 2014-03-26 18:12
  • 301

POJ 3069

Sarumans Army Time Limit: 1000MS   Memory Limit: 65536K Total Submissions...
  • ericxieforever
  • ericxieforever
  • 2008-04-07 23:33
  • 700

HDU 3340 Rain in ACStar(线段树+几何)

HDU 3340 Rain in ACStar 题目链接 题意:给定几个多边形(3-5边形),然后中间有一些询问,询问一个区间的总面积 思路:多边形分割为梯形,梯形的面积为上底d1 + 下底d2 乘上 高度 / 2,两个梯形面积累加的话,可以等价为上底下底累加,所以就可以用线段树搞...
  • u011217342
  • u011217342
  • 2014-10-18 15:32
  • 902

hdu 3069(贪心)

点击打开链接 题意: x轴上有n点,每个点都有一个覆盖距离m,求最少需要多少个点可以把所有的点覆盖。。。 这里主要是要找以那个点为中心。 比如1 7 15 20 30 50 70(m=10) 刚开始用1为中心,它的覆盖距离为1-11,因为7在范围内,所以可以以7为中心,以7...
  • yyf573462811
  • yyf573462811
  • 2013-08-13 19:34
  • 541

poj 3069 贪心

背景:1Y,但是思考的时候并没有充分思考好思路再写,而是有点含糊的边写边想,这样不好,一定要思路已经十分明确了再写。 思路:从一个没有被覆盖的点开始,在以它为中心半径为r的区域内,至少有一个点标记,那么就选择,距离它最远的点。标记这个点之后,算出下一个没有被标记的点,重复以上操作即可。这里把最后一...
  • jibancanyang
  • jibancanyang
  • 2015-04-10 15:44
  • 481

poj 3069贪心~

点击打开链接http://poj.org/problem?id=3069#include #include #define M 1010 using namespace std; int a[M]; int main() { int r,n,i,j,k,ans; while(1) { ...
  • Jeremy1149
  • Jeremy1149
  • 2016-05-22 17:56
  • 146
    个人资料
    • 访问:37755次
    • 积分:2361
    • 等级:
    • 排名:第18627名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:8条
    最新评论