hdu3622

Bomb Game

Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3350 Accepted Submission(s): 1149

Problem Description
Robbie is playing an interesting computer game. The game field is an unbounded 2-dimensional region. There are N rounds in the game. At each round, the computer will give Robbie two places, and Robbie should choose one of them to
put a bomb. The explosion area of the bomb is a circle whose center is just the chosen place. Robbie can control the power of the bomb, that is, he can control the radius of each circle. A strange requirement is that there should be no common area for any
two circles. The final score is the minimum radius of all the N circles.

Robbie has cracked the game, and he has known all the candidate places of each round before the game starts. Now he wants to know the maximum score he can get with the optimal strategy.
Input
The first line of each test case is an integer N (2 <= N <= 100), indicating the number of rounds. Then N lines follow. The i-th line contains four integers x1i, y1i, x2i, y2i, indicating
that the coordinates of the two candidate places of the i-th round are (x1i, y1i) and (x2i, y2i). All the coordinates are in the range [-10000, 10000].
Output
Output one float number for each test case, indicating the best possible score. The result should be rounded to two decimal places.
Sample Input
2
1 1 1 -1
-1 -1 -1 1
2
1 1 -1 -1
1 -1 -1 1
Sample Output
1.41
1.00

题目大题:

给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),
每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸
的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相
交(可以相切),求解这个最大半径.
首先二分最大半径值,然后2-sat构图判断其可行性,对于每
两队位置(u,uu)和(v,vv),如果u和v之间的距离小于2*id,也就
是说位置u和位置v处不能同时防止炸弹(两范围相交),所以连边(u,vv)
和(v,uu),求解强连通分量判断可行性.
为了确保精度问题,在计算过程当中先不开方。。。。。

程序:

#include"stdio.h"
#include"string.h"
#include"stack"
#include"math.h"
#define M 209
using namespace std;
stack<int>q;
int head[M],dfn[M],low[M],belong[M],use[M],t,n,index,num,cnt[M];
struct st
{
int u,v,next;
}edge[M*200];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++index;
q.push(u);
use[u]=1;
int i;
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(use[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
int vv;
num++;
do
{
vv=q.top();
belong[vv]=num;
q.pop();
use[vv]=0;
}while(u!=vv);
}
}
void solve()
{
index=num=0;
memset(dfn,0,sizeof(dfn));
memset(use,0,sizeof(use));
for(int i=1;i<=n*2;i++)
{
if(!dfn[i])
tarjan(i);
}
}
double len(double x1,double y1,double x2,double y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
int i,j;
double x1[M],y1[M],x2[M],y2[M];
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
scanf("%lf%lf%lf%lf",&x1[i],&y1[i],&x2[i],&y2[i]);
double max1=-1;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
double ans=len(x1[i],y1[i],x1[j],y1[j]);
max1=max(max1,ans);
ans=len(x1[i],y1[i],x2[j],y2[j]);
max1=max(max1,ans);
ans=len(x2[i],y2[i],x1[j],y1[j]);
max1=max(max1,ans);
ans=len(x2[i],y2[i],x2[j],y2[j]);
max1=max(max1,ans);
}
}
double left,right,mid;
left=0;
right=max1*2;
while(fabs(right-left)>=0.005)
{ mid=(left+right)/2;
init();
for(i=1;i<=n;i++)
{
for(j=1+i;j<=n;j++)
{
double ans=len(x1[i],y1[i],x1[j],y1[j]);
if(ans<mid)
{
add(i*2-1,j*2);
add(j*2-1,i*2);
}
ans=len(x1[i],y1[i],x2[j],y2[j]);
if(ans<mid)
{
add(2*i-1,2*j-1);
add(2*j,2*i);
}
ans=len(x2[i],y2[i],x1[j],y1[j]);
if(ans<mid)
{
add(2*i,2*j);
add(2*j-1,2*i-1);
}
ans=len(x2[i],y2[i],x2[j],y2[j]);
if(ans<mid)
{
add(2*i,2*j-1);
add(2*j,i*2-1);
}
}
}
solve();
int flag=0;
for(i=1;i<=n;i++)
{
if(belong[i*2-1]==belong[i*2])
{
flag++;
break;
}
}
if(flag)
{
right=mid;
}
else
{
left=mid;
}
}
printf("%.2lf\n",sqrt(mid)/2.0);
}
}

2-sat+二分搜索hdu(3622)的更多相关文章

  1. HDU 3622 Bomb Game(2-sat)

    HDU 3622 Bomb Game 题目链接 题意:求一个最大半径,使得每一个二元组的点任选一个,能够得到全部圆两两不相交 思路:显然的二分半径,然后2-sat去判定就可以 代码: #include ...

  2. HDU 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 【HDU 3622】Bomb Game

    http://acm.hdu.edu.cn/showproblem.php?pid=3622 二分答案转化成2-sat问题. 上午测试时总想二分后把它转化成最大点独立集但是不会写最大点独立集暴力又秘制 ...

  4. hdu 3622(二分+2-sat判断可行性)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622 思路:二分是容易想到的,由于题目中有明显的矛盾关系,因此可以用2-sat来验证其可行性.关键是如 ...

  5. HDU 3622 Bomb Game

    Description \(n\) 个炸弹,每个炸弹有两个放置点,可以任选一个,问你最大的半径是多少. Sol 二分+2-SAT+Tarjan. 首先二分一下答案.然后就成了一个2-SAT问题. 建模 ...

  6. hdu 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. HDU 3622 Bomb Game(二分+2SAT)

    题意:有一个游戏,有n个回合,每回合可以在指定的2个区域之一放炸弹,炸弹范围是一个圈,要求每回合的炸弹范围没有重合.得分是炸弹半径最小的值.求可以得到的最大分数. 思路:二分+2SAT. 二分炸弹范围 ...

  8. hdu 3622 二分+2-SAT判定

    思路:如题 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio& ...

  9. Bomb Game HDU - 3622(二分最小值最大化)

    题意: 就是给出n对坐标,每对只能选一个,以选出来的点为圆心,半径自定义,画圆,而这些圆不能覆盖,求半径最小的圆的最大值 解析: 看到最x值最x化,那二分变为判定性问题,然后...然后我就没想到... ...

随机推荐

  1. 13 款最棒的 jQuery 图像 360° 旋转插件

    在 web 页面上使用 jQuery 图像 360 度旋转插件是最美也是最方便的显示图像的方式.这些超级棒的 360° 图像选择插件允许用户更详细的分析产品或者文章.jQuery 图像旋转插件可以让用 ...

  2. -27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found

    LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止. 错误现象:Action.c(41): Error -27979: Request ...

  3. Python if-else and while

    if-elif语法 if condition: [tab键] command elif condition: [tab键] command elif condition: [tab键] command ...

  4. 几种常见的DIV边框样式

    <html> <head> <title>边框样式</title> </head> <body> <p style=bor ...

  5. python中常用的内建模块

    [datetime] datetime是python处理日期和时间的标准库 获取当前日期和时间 我们先看如何获取当前日期和时间: 注意到datetime是模块,datetime模块还包含一个datet ...

  6. 第三百一十四节,Django框架,自定义分页

    第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...

  7. e673. Getting Amount of Free Accelerated Image Memory

    Images in accelerated memory are much faster to draw on the screen. However, accelerated memory is t ...

  8. ubuntu 系统网络突然"网络已禁用"

    sudo service network-manager stop  sudo rm /var/lib/NetworkManager/NetworkManager.state  sudo servic ...

  9. 【转载】关于quartus ii软件中注释乱码问题的解决方法

    最近在看Verilog代码,由于我的quartus版本打开他们的文件注释会全部乱码,痛苦万分!从网上找了下原因,解决方法基本没有,不过看到有人提出是编码的问题,立马我就想到一个解决方法,经过实验果然有 ...

  10. perl 函数的参数列表

    在perl中,定义一个函数的时候,不需要在圆括号内指定具体的参数,所有的参数都从@_ 这个列表中得到 代码示例: sub test { my ($a, $b) = @_; print qq{$a\t$ ...