给n<=100对点,从每对点里面挑一个并以这些挑出的点为圆心画圆,并且这些圆不能互相覆盖,找出一种方案使得这些圆半径中最小的那个最大。

“最小值最大”就是二分答案啦!考虑现在每个点都画出半径x的圆,如何选点呢?

可以发现选了一个点P之后与其距离相差2x内的点Q都不能被选,也就是“与P在同一对的另一个点P'    或    与Q在同一对的另一个点Q'”

有了或语句描述选点冲突,接下来就是2-SAT构图啦!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<cmath>
  6. //#include<iostream>
  7. using namespace std;
  8.  
  9. int n;
  10. #define maxn 111*2
  11. struct Edge{int to,next;};
  12. #define maxe maxn*maxn
  13. struct Graph
  14. {
  15. Edge edge[maxe];int le;
  16. int first[maxn],vis[maxn];
  17. void clear()
  18. {
  19. le=;
  20. memset(first,,sizeof(first));
  21. }
  22. void insert(int x,int y)
  23. {
  24. edge[le].to=y;
  25. edge[le].next=first[x];
  26. first[x]=le++;
  27. }
  28. void add_clause(int x,int y)
  29. {
  30. insert(x^,y);
  31. insert(y^,x);
  32. }
  33. int sta[maxn],top;
  34. bool dfs(int x)
  35. {
  36. if (vis[x^]) return ;
  37. if (vis[x]) return ;
  38. vis[x]=;
  39. sta[++top]=x;
  40. for (int i=first[x];i;i=edge[i].next)
  41. if (!dfs(edge[i].to)) return ;
  42. return ;
  43. }
  44. bool twosat()
  45. {
  46. memset(vis,,sizeof(vis));
  47. for (int i=;i<=n;i++)
  48. if (!vis[i*] && !vis[i*+])
  49. {
  50. top=;
  51. if (!dfs(i*))
  52. {
  53. for (;top;top--) vis[sta[top]]=;
  54. if (!dfs(i*+)) return ;
  55. }
  56. }
  57. return ;
  58. }
  59. }G;
  60. struct Point
  61. {
  62. int x,y;
  63. }a[maxn];
  64. double dis[maxn][maxn];
  65. #define eps 1e-5
  66. double sqr(double x) {return x*x;}
  67. double caldis(int p,int q)
  68. {
  69. return sqrt(sqr(a[p].x-a[q].x)+sqr(a[p].y-a[q].y));
  70. }
  71. bool judge(double x)
  72. {
  73. for (int i=;i<=n;i++)
  74. for (int j=i+;j<=n;j++)
  75. {
  76. if (dis[i*][j*]<x*) G.add_clause(i*+,j*+);
  77. if (dis[i*+][j*]<x*) G.add_clause(i*,j*+);
  78. if (dis[i*][j*+]<x*) G.add_clause(i*+,j*);
  79. if (dis[i*+][j*+]<x*) G.add_clause(i*,j*);
  80. }
  81. return G.twosat();
  82. }
  83. int main()
  84. {
  85. while (~scanf("%d",&n))
  86. {
  87. for (int i=;i<=n;i++)
  88. scanf("%d%d%d%d",&a[i*].x,&a[i*].y,&a[i*+].x,&a[i*+].y);
  89. double L=0.0,R=0.0;
  90. for (int i=;i<=n*+;i++)
  91. for (int j=;j<=n*+;j++)
  92. dis[i][j]=caldis(i,j),R=max(R,dis[i][j]);
  93. while (R-L>=eps)
  94. {
  95. G.clear();
  96. double mid=(L+R+eps)/;
  97. if (judge(mid)) L=mid;
  98. else R=mid-eps;
  99. }
  100. printf("%.2lf\n",L);
  101. }
  102. return ;
  103. }

hdu3622:Bomb Game的更多相关文章

  1. HDU 5934:Bomb(强连通缩点)

    http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有N个炸弹,每个炸弹有一个坐标,一个爆炸范围和一个爆炸花费,如果一个炸弹的爆炸范围内有另外的炸弹,那 ...

  2. hdu3622(二分+two-sat)

    传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...

  3. Python:游戏:测试打字速度

    现在写书的人真是一点责任心都没有,最近看了几本书,其中的代码都存在错误. 最近迷恋 Python 游戏,买了<Python游戏编程入门>[美] Jonathan S·Harbour 著 一 ...

  4. 用javascript 面向对象制作坦克大战(四)

    我们现在还差一个重要的功能,没错,敌人坦克的创建以及子弹击中敌人坦克时的碰撞检测功能. 5.  创建敌人坦克完成炮弹碰撞检测 5.1   创建敌人坦克对象 敌人坦克和玩家坦克一样,同样继承自我们的坦克 ...

  5. Python游戏编程入门3

    用户输入:Bomb Catcher游戏本章介绍使用键盘和鼠标获得用户输入.包括如下主题:学习pygame事件学习实时循环学习键盘和鼠标事件学习轮询键盘和鼠标的状态编写Bomb Catcher游戏 1本 ...

  6. 增强学习训练AI玩游戏

    1.游戏简介 符号A为 AI Agent. 符号@为金币,AI Agent需要尽可能的接取. 符号* 为炸弹,AI Agent需要尽可能的躲避. 游戏下方一组数字含义如下: Bomb hit: 代表目 ...

  7. 制作一款3D炸弹超人游戏

    说起炸弹超人,相信很多朋友都玩过类似的游戏,其中最为人熟知的莫过于<泡泡堂>.该类型游戏需要玩家在地图中一边跑动一边放置炸弹,同时还要躲避敌方炸弹保护自己.最初的炸弹超人游戏都是2D的,今 ...

  8. 初学Direct X(4)

    初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...

  9. [jzoj NOIP2018模拟10.23]

    丢分主要是下面几个方面: 1.T2代码交错了,有个特判没写丢了10分 2.T1线段树加等差数列写错了(其实二维差分就可以,但我当时不会) 3.T3思考再三还是为了10分写上了主席树,还是写错了 总体评 ...

随机推荐

  1. 使用NPOI操作Excel文件及其日期处理

    工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...

  2. CF385C Bear and Prime Numbers

    思路: 需要对埃氏筛法的时间复杂度有正确的认识(O(nlog(log(n)))),我都以为肯定超时了,结果能过. 实现: #include <bits/stdc++.h> using na ...

  3. Javaweb学习笔记3—Serverlet

    今天来讲javaweb的第三个阶段学习. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 ...

  4. How `delete’ works ?

    这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=21 February 16, 2013 How `delete’ works ...

  5. 从源码中无法看出函数所在的js脚本的解决方法

    通过设置断点调试使js脚本自动出现

  6. 46 Simple Python Exercises-Higher order functions and list comprehensions

    26. Using the higher order function reduce(), write a function max_in_list() that takes a list of nu ...

  7. js递归和数组去重(简单便捷的用法)

    1.递归例子<script type="text/javascript"> function test(num) { if(num < 0) { return; ...

  8. 【转载】SQL Server 2012 日志传送

    SQL Server 2012 日志传送 一.准备: 数据库为完全恢复模式,并事先做一次完全备份. 共享一个文件夹,主机备份放在这个文件夹,而且客户机有权访问这个共享文件夹. 二.基本配置 1.启动配 ...

  9. 聊聊JavaScript和Scala的表达式 Expression

    我们先看下面这段简单的JavaScript代码. 我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式. 函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其 ...

  10. app支付宝授权登录获取用户信息

    由后台进行地址的拼接(前台进行授权) // 生成授权的参数 String sign = ""; Long userId1 = SecurityUser.getUserId(); S ...