• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

plank george

人生豪迈,只不过是重头再来。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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\n",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);

posted on 2013-07-28 20:07  plank george  阅读(152)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3