zoukankan      html  css  js  c++  java
  • poj 1328 Radar Installation

    题目链接:http://poj.org/problem?id=1328

    题意:给出海上有n个小岛的坐标,求发出的信号可以覆盖全部小岛的最少的雷达个数。雷达发射信号是以雷达为圆心,d为半径的圆,雷达都在x轴上。

    分析:1.刚开始就知道这道题要用贪心做,但是一下子想不出该如何贪心。然后图图画画后发现只要求出可以覆盖每一个小岛的雷达的区间范围即可,然后可以转化为贪心区间求点问题。正好今天在复习贪心思想时在紫书上看到这个例子啦~(紫书P233)

    2.贪心区间求点,就是排序后尽量选择重合区间多的地方选择放点。

    3.但是还是WA了一次,因为标记数字is[]没有初始化...T^T题目有多组输入,单独测样例时答案都对,一起测多组的时候就错,还好后来还是发现了这个错误。

    贴代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<cmath>
     5 #include<string>
     6 #include<cstring>
     7 #include<algorithm>
     8 #include<vector>
     9 using namespace std;
    10 struct QuJian
    11 {
    12     double l,r;
    13 };
    14 int cmp(QuJian a,QuJian b)
    15 {
    16     if(a.r==b.r)
    17         return a.l>b.l;
    18     return a.r<b.r;
    19 }
    20 QuJian qu[1010];
    21 int is[1010];
    22 int main()
    23 {
    24     //freopen("in.txt","r",stdin);
    25     //freopen("out.txt","w",stdout);
    26     int n,d;
    27     int t=0;
    28     while(scanf("%d%d",&n,&d)==2)
    29     {
    30         if(!n&&!d)
    31            break;
    32         int x,y;
    33         memset(is,0,sizeof(is));
    34         double tp;
    35         bool flag=1;
    36         for(int i=0;i<n;i++)
    37         {
    38             scanf("%d%d",&x,&y);
    39             tp=d*d-y*y;
    40             if(tp<0||d<0)
    41             {
    42                 flag=0;
    43                 continue;
    44             }
    45             if(flag)
    46             {
    47                 qu[i].l=x-sqrt(tp);
    48                 qu[i].r=x+sqrt(tp);
    49             }
    50         }
    51         if(!flag)
    52             printf("Case %d: -1
    ",++t);
    53         else
    54         {
    55             int ans=0;
    56             sort(qu,qu+n,cmp);
    57             //for(int i=0;i<n;i++)
    58             //    cout<<qu[i].l<<" "<<qu[i].r<<endl;
    59             for(int i=0;i<n;i++)
    60             {
    61                 if(is[i])
    62                    continue;
    63                 ans+=1;
    64                 for(int j=i+1;j<n;j++)
    65                 {
    66                     if(qu[j].l<=qu[i].r)
    67                         is[j]=1;
    68                 }
    69             }
    70             printf("Case %d: %d
    ",++t,ans);
    71         }
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    Quartz学习笔记
    apache shiro学习笔记
    zTree学习笔记
    WebService学习笔记
    【webservice】Two classes have the same XML type name(转)
    使用OCUpload和POI一键上传Excel并解析导入数据库
    EasyUI学习笔记(四)—— datagrid的使用
    thinkphp的路径问题
    thinkphp验证码不现实多半是bom惹的祸
    TPM(ThinkPHPMobile)使用简明教程
  • 原文地址:https://www.cnblogs.com/tristatl/p/5892877.html
Copyright © 2011-2022 走看看