乍一看这个问题似乎是很复杂,但其实很好解决。

  先处理出每个点到原点的距离和到x正半轴的角度(从x正半轴逆时针旋转的角度)。然后以后者进行排序。

  枚举每一个点到圆心的距离,作为半径,并找出其他到圆心距离不超过这个值的点,由于他们的角度是有序的,因此线性的找出角度差最小的满足题意的两个点即可(相当于拿一个长度为k的尺子不断地移动过去)。

  那么总的复杂度为O(n^2)。

  代码如下(注意atan2的用法):

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <math.h>
  5. using namespace std;
  6. const int N = + ;
  7. const double pi = acos(-);
  8.  
  9. int n,k;
  10. struct node
  11. {
  12. int x, y;
  13. double angle, dis;
  14. void get()
  15. {
  16. double t = x * x + y * y;
  17. //dis = sqrt(t);
  18. dis = t;
  19.  
  20. angle = atan2(1.0*y, 1.0*x);
  21. /*if(y >= 0)
  22. {
  23. if(x >= 0)
  24. {
  25. angle = asin(1.0*y / dis);
  26. }
  27. else
  28. {
  29. angle = pi - asin(1.0*y / dis);
  30. }
  31. }
  32. else
  33. {
  34. if(x >= 0) angle = 2.0 * pi - asin(1.0*y / dis);
  35. else angle = pi + asin(1.0*y / dis);
  36. }*/
  37. }
  38. bool operator < (const node & t) const
  39. {
  40. if(fabs(angle - t.angle) < 1e-)
  41. {
  42. return dis < t.dis;
  43. }
  44. return angle < t.angle;
  45. }
  46. }p[N];
  47.  
  48. double q[N*];
  49.  
  50. int main()
  51. {
  52. int kase = ;
  53. while(scanf("%d%d",&n,&k) == )
  54. {
  55. if(n == && k == ) break;
  56. for(int i=;i<=n;i++)
  57. {
  58. scanf("%d%d",&p[i].x,&p[i].y);
  59. p[i].get();
  60. }
  61. sort(p+,p++n);
  62.  
  63. if(k == ) {printf("Case #%d: 0.00\n",kase++); continue;}
  64.  
  65. double ans = 1e10;
  66. for(int i=;i<=n;i++)
  67. {
  68. double r = p[i].dis;
  69. int num = ;
  70. for(int j=;j<=n;j++)
  71. {
  72. if(p[j].dis <= r) q[++num] = p[j].angle;
  73. }
  74. if(num < k) continue;
  75. for(int j=;j<=num;j++)
  76. {
  77. q[j+num] = *pi + q[j];
  78. }
  79. for(int j=;j<=num;j++)
  80. {
  81. ans = min(ans, r * (q[j+k-] - q[j]) / 2.0);
  82. }
  83. }
  84. printf("Case #%d: %.2f\n",kase++,ans);
  85. }
  86. return ;
  87. }

UVALive 3716 DNA Regions ——(扫描法)的更多相关文章

  1. UVALive 3716 DNA Regions

    题目大意:给定两个长度相等的字符串A和B,与一个百分比p%,求最长的.失配不超过p%的区间长度.O(nlogn). 题目比较简单套路,推推式子就好了. 记S[i]表示到下标i一共有多少个失配,就相当于 ...

  2. UVALive 3716 DNA Regions ——(式子变形)

    一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...

  3. uvalive 3602 DNA Consensus String

    https://vjudge.net/problem/UVALive-3602 题意: 给定m个长度均为n的DNA序列,求一个DNA序列,使得它到所有的DNA序列的汉明距离最短,若有多个解则输出字典序 ...

  4. uvalive 4851 Restaurant(扫描法)

    题意:有一个M*M的网格,坐标[0...M-1,0...M-1] 网格里面有两个y坐标同样的宾馆A和B.以及n个餐厅,宾馆AB里面各有一个餐厅,编号1,2,其它餐厅编号3-n.如今你打算新开一家餐厅. ...

  5. UVALive 6663 Count the Regions --离散化+DFS染色

    题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域 ...

  6. [UVALive 6663 Count the Regions] (dfs + 离散化)

    链接:https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_p ...

  7. UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675">点击打开链接 gg.. ...

  8. UvaLive 6663 Count the Regions 离散化+DFS

    链接:http://vjudge.net/problem/viewProblem.action?id=49408 题意:在平面内给出若干个矩形,求出它们能将整个平面分成多少份. 思路:刚開始一眼看到认 ...

  9. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

随机推荐

  1. 关于__new__和__init__

    关于__new__和__init__ 例如一个类 class Foo(object): def __init__(self): print(1) def __new__(self): print(2) ...

  2. Android中BroadcastReceiver的使用

    1.Android中广播分为静态注册和动态注册 2.下面是一个简单静态注册的例子 创建一个继承BroadcastReceiver的子类 public class DeviceBootReceiver ...

  3. 基于【 Docker】五 || maven私服环境搭建

    1.Maven  Nexus私服的原理 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库.当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓 ...

  4. 一个SAP开发人员的养蚕流水帐

    Jerry打算以此文来给汪子熙全家进行了一个多月的养蚕经历画上一个圆满的句号. 南方长大的80后,对蚕应该不会太陌生.大家还记得你们小时候学过的课文<蚕姑娘>么?课文开头是这样的: 春天天 ...

  5. 解决yum命令后出现libldap-2.4.so.2: cannot open shared object file

    问题: [root@lgh ~]# yum There was a problem importing one of the Python modules required to run yum. T ...

  6. springboot系列(二) 创建springboot工程

    本文转载自:https://www.cnblogs.com/magicalSam/p/7171716.html 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 ...

  7. SVN 执行cleanup报错:Cleanup failed to process the following paths

    SVN 执行cleanup报错:Cleanup failed to process the following paths 先来说下这个错误的原因:用SVN在使用过程中,各种原因中途取消或中断,导致需 ...

  8. MySQL基础部分(一)

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...

  9. php curl请求接口并获取数据

    当我们在做php开发的时候,很多时候需要对接口进行测试,或者更方便的调用一些已有模块的接口,取到结果并进行后续操作,我们可以通过curl进行模拟提交post和get请求,来去实现这些功能. 下面是对c ...

  10. No package libmcrypt available.

    Centos安装PHP时,安装php依赖包时yum install libmcrypt libmcrypt-devel,报错如下: No package libmcrypt available. No ...