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);

原文地址:https://www.cnblogs.com/plank-george-zzo/p/3221492.html