zoukankan      html  css  js  c++  java
  • 【POJ】[1328]Radar Installation

    这里写图片描述
    这里写图片描述

    因为雷达必须要建立在x轴上
    所以当y>d则-1

    求出以点为圆心,d为半径的圆
    与x轴交于两点
    若雷达在两点之间
    则可以覆盖这个点

    因为区间有重合的部分
    所以只需在重合部分放点
    则可以覆盖尽量多的点

    由此可把问题转换为
    给出数段区间
    问使每个区间至少有一个点需要多少点

    所以想出贪心策略
    可以区间右端点排序
    比较时假设在第一个右端点建立雷达
    坐标记为t
    则若下一端点的左端点在此点之后
    则把t更新为下一端点的右端点
    并使cnt++

    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    struct node {
        double x,y;
        double l,r;
    } a[1200];
    bool cmp(node A,node B) {
        if(A.r==B.r)
            return A.l>B.l;
        else
            return A.r<B.r;
    }
    int main() {
        int n,kase=0;
        double d;
        while(scanf("%d %lf",&n,&d),n||d) {
            bool flag=false;
            for(int i=0; i<n; i++) {
                scanf("%lf %lf",&a[i].x,&a[i].y);
                if(a[i].y>d)
                    flag=true;
            }
            printf("Case %d: ",++kase);
            if(flag) {
                printf("-1
    ");
                continue;
            }
            for(int i=0; i<n; i++) {
                a[i].r=a[i].x+sqrt(d*d-a[i].y*a[i].y);
                a[i].l=a[i].x-sqrt(d*d-a[i].y*a[i].y);
            }
            sort(a,a+n,cmp);
            int cnt=1;
            double t=a[0].r;
            for(int i=1; i<n; i++) {
                if(a[i].l>t) {
                    cnt++;
                    t=a[i].r;
                }
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    

    题目地址:【POJ】[1328]Radar Installation

  • 相关阅读:
    【转】SQL时间函数
    C#操作Word完全方法
    出水芙蓉,风华绝代记民国才女林徽因
    梅超风:我就是那个多年以前的女子
    厉胜男
    南海恶神
    挪窝
    吴若权——洛可可动画电影馆
    美的慢箭
    机械公敌(I, Robot) 场景设定
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569495.html
Copyright © 2011-2022 走看看