POJ1328 Radar Installation 图形转化 贪心 排序
这个题目是一道数学几何与编程算法相结合的好题,通过以雷达为圆心以d为半径画圆的这种转化,使得问题变得简单。
代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",test++,cou); 61 } 62 return 0; 63 }
虽然思路很清晰了,但是从开始提交到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);
posted on 2013-07-28 20:07 plank george 阅读(152) 评论(0) 编辑 收藏 举报