• POJ1328 Radar Installation 图形转化 贪心 排序


    这个题目是一道数学几何与编程算法相结合的好题,通过以雷达为圆心以d为半径画圆的这种转化,使得问题变得简单。

    代码如下

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<cstdlib>
     7 using namespace std;
     8 
     9 #define eps 1e-9
    10 struct point
    11 {
    12     double x,y;
    13     double l,r;
    14 }isl[5010],p;
    15 int cmp(point a,point b)
    16 {
    17     return a.l < b.l;
    18 }
    19 int cou;
    20 float kl,kr;
    21 int main()
    22 {
    23     //freopen("in.txt","r",stdin);
    24     double d,ppp;
    25     int n;
    26     int test=1;
    27     while(~scanf("%d%lf",&n,&d))
    28     {
    29         cou=1;
    30         if(!n&&!d)break;
    31         for(int i=0;i<n;i++)
    32         {
    33             scanf("%lf%lf",&isl[i].x,&isl[i].y);
    34             ppp=(isl[i].y);
    35             if(d<(fabs(ppp))){cou=-1;}
    36             else{isl[i].l=isl[i].x-sqrt(d*d-isl[i].y*isl[i].y);
    37             isl[i].r=isl[i].x+sqrt(d*d-isl[i].y*isl[i].y);}
    38         }
    39         //现在按照左端点排序,从小到大
    40         if(cou!=-1)
    41         {
    42         sort(isl,isl + n,cmp);
    43         kl=isl[0].l;
    44         kr=isl[0].r;
    45         for(int i=1;i<n;i++)
    46         {
    47             if(kr > isl[i].r)
    48             {
    49                 kr=isl[i].r;
    50                 //kr=isl[i].r;
    51             }
    52             else if(kr < isl[i].l )
    53             {
    54                 //kl=isl[i].l;
    55                 kr=isl[i].r;
    56                 cou++;
    57             }
    58         }
    59         }
    60         printf("Case %d: %d
    ",test++,cou);
    61     }
    62     return 0;
    63 }
    View Code

    虽然思路很清晰了,但是从开始提交到AC一共WA了近二十次,后来实在没办法,找学长看了半天,试了各种修改,才发现问题在哪里。

    关于排序有一个在#includ<stdlib,h>中的qsort函数,还有一个在#include<algorithm.h>中的sort函数,这两个函数看起来功能差不多,但其实qsort函数是不安全的!

    这个题目就是一个很好的例子,我用qsort进行排序结果是WA,用sort就可以AC。事后有同学交流,说他也有一次是这样,qsort函数排序了之后有一组数据还是乱的。

    在这里,我以亲生经历,建议大家使用sort函数进行排序,现在开始忘掉qsort。下面简介sort函数的使用。

     sort 函数�可以直接对数组排序�复杂度为 n*log2(n) 。 使用这个函数�需要包含头文件#include <algorithm>。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址�第二个参数是区间尾地址的下一地址。也就是说�排序的区间是 [a,b) 。简单来说�有一个数组 int a[100] �要对从 a[0] 到 a[99] 的元素进行排序�只要写 sort(a,a+100) 就行了�默认的排序方式是升序。

    排序的数据类型不局限于整数�只要是定义了小于运算的类型都可以�比如字符串类 string 。 如果是没有定义小于运算的数据类型�或者想改变排序的顺序�就要用到第三参数——比较函数。比较函数是一个自己定义的函数�返回值是 bool 型�它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列�可以先定义一个比较函数 cmp  bool cmp(int a,int b)  {  return a>b;  }  排序的时候就写 sort(a,a+100,cmp);  假设自己定义了一个结构体 node  struct node{  int a;  int b;  double c;  }  有一个 node 类型的数组 node arr[100] �想对它进行排序�先按 a 值升序排列�如果 a 值相同�再按 b 值降序排列�如果 b 还相同�就按 c 降序排列。就可以写这样一个比较函数� 以下是代码片段

    bool cmp(node x,node y)  {  if(x.a!=y.a) return x.a  if(x.b!=y.b) return x.b>y.b;  return return x.c>y.c;  }  排序时写 sort(arr,a+100,cmp);

  • 相关阅读:
    MySQL慢查询优化问题解决办法
    Jetpack的ViewModel与LiveData
    Jetpack的ViewModel与LiveData总结
    跟大家分享Entity Framework使用Code First方式如何连接到现有数据库
    SharePoint2010主题和样式揭秘(1)
    gitlab备份命令
    通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景
    Node.js基础入门第一天
    走进WPF之绘制冰墩墩
    Node.js基础入门第二天
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3221492.html
Copyright © 2020-2023  润新知