HDOJ 3622 Bomb Game

二分距离2sat

Bomb Game

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

Total Submission(s): 3382    Accepted Submission(s): 1161

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

Source

2010 Asia Regional Tianjin Site
—— Online Contest

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn=222;

struct Edge
{
    int to,next;
}edge[maxn*maxn*3];

int Adj[maxn],Size;

void init()
{
    Size=0; memset(Adj,-1,sizeof(Adj));
}

void Add_Edge(int u,int v)
{
    edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++;
}

int Low[maxn],DFN[maxn],Belong[maxn],Instack[maxn],Stack[maxn];
int top,scc,Index;

void tarjan(int u)
{
    Low[u]=DFN[u]=++Index;
    Instack[u]=true; Stack[top++]=u;
    int v;

    for(int i=Adj[u];~i;i=edge[i].next)
    {
        v=edge[i].to;
        if(!DFN[v])
        {
            tarjan(v);
            Low[u]=min(Low[u],Low[v]);
        }
        else if(Instack[v])
        {
            Low[u]=min(Low[u],DFN[v]);
        }
    }

    if(Low[u]==DFN[u])
    {
        scc++;
        do
        {
            v=Stack[--top];
            Belong[v]=scc;
            Instack[v]=false;
        }while(v!=u);
    }
}

bool scc_solve(int n)
{
    memset(DFN,0,sizeof(DFN));
    memset(Instack,0,sizeof(Instack));
    top=scc=Index=0;

    for(int i=0;i<2*n;i++)
        if(!DFN[i]) tarjan(i);

    for(int i=0;i<n;i++)
    {
        if(Belong[i<<1]==Belong[i<<1|1]) return false;
    }
    return true;
}

int n;
int px[maxn][2],py[maxn][2];
int dist(int x,int y)
{
    return x*x+y*y;
}

bool ck(int mid)
{
    init();
    for(int i=0;i<n;i++)
    {
        for(int a=0;a<2;a++)
        {
            for(int j=i+1;j<n;j++)
            {
                for(int b=0;b<2;b++)
                {
                    if(dist(px[i][a]-px[j][b],py[i][a]-py[j][b])<mid)
                    {
                        Add_Edge(i*2+a,j*2+1-b);
                        Add_Edge(j*2+b,i*2+1-a);
                    }
                }
            }
        }
    }
    return scc_solve(n);
}

void solve()
{
    int low=0,mid,high=2000000000,ans=-1;
    while(low+1<high)
    {
        mid=(low+high)/2.;
        if(ck(mid)) ans=mid,low=mid;
        else high=mid;
    }
    printf("%.2lf\n",sqrt((double)ans)/2.);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        double x1,x2,y1,y2;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d%d",&px[i][0],&py[i][0],&px[i][1],&py[i][1]);
        }
        solve();
    }
    return 0;
}

HDOJ 3622 Bomb Game

时间: 2024-10-25 13:43:08

HDOJ 3622 Bomb Game的相关文章

HDOJ 3622 Bomb Game 2-sat

http://acm.hdu.edu.cn/showproblem.php?pid=3622 题意:上个月写的,题目好像是说一对点要选一个引爆,引爆半径自己选,任意两圆不能相交,最后分数是所有圆的最小半径,求最大分数. 分析:二分半径,2-sat判定可行性. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std;

HDU 3622 Bomb Game(2-sat)

HDU 3622 Bomb Game 题目链接 题意:求一个最大半径,使得每个二元组的点任选一个,可以得到所有圆两两不相交 思路:显然的二分半径,然后2-sat去判定即可 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <cmath> #include <algorithm> using namespace s

HDU 3622 Bomb Game(二分+2SAT)

题意:有一个游戏,有n个回合,每回合可以在指定的2个区域之一放炸弹,炸弹范围是一个圈,要求每回合的炸弹范围没有重合.得分是炸弹半径最小的值.求可以得到的最大分数. 思路:二分+2SAT. 二分炸弹范围,再根据有无重合建图,用2SAT判定. #include <cstdio> #include <cmath> #include <vector> #include <cstring> using namespace std; const int maxn =10

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

Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5396    Accepted Submission(s): 1925 Problem Description Robbie is playing an interesting computer game. The game field is an unbounde

HDU 3622 Bomb Game

Bomb Game Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 362264-bit integer IO format: %I64d      Java class name: Main Robbie is playing an interesting computer game. The game field is an unbounded 2-dimens

【HDU】3622 Bomb Game(2-SAT)

http://acm.hdu.edu.cn/showproblem.php?pid=3622 又是各种逗.. 2-SAT是一种二元约束,每个点可以置于两种状态,但只能处于一种状态,然后图是否有解就是2-SAT啦. 看白书吧. x1和x2分别表示x处于1和x

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

题目地址:HDU 3622 先二分半径,然后小于该半径的不能选,对这些不能选的点对进行加边.然后判断可行性即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue

hdoj 3555 Bomb(DFA+dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 思路分析:该问题要求求解1—N中的数中含有49的数的个数,可以使用DFA来递推dp公式:详细解释点击链接查看: 代码如下: #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX_N = 20 + 10; long long dp[MAX_N

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

题目大意:玩一个放炸弹游戏,有N次放炸弹的机会,每次放炸弹时,你都有两个位置可以选择,问如何放炸弹,能使爆炸的炸弹的半径的最小值最大(炸弹爆炸半径可以控制,但是爆炸形成的圈不能有重叠部分) 解题思路:最小值最大,二分 二分半径,如果有不满足的点,就建立起限制边,接着判断能否完成染色即可 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <