设为首页 加入收藏

TOP

计算气球半径让其不相交(一)
2013-12-12 14:36:47 来源: 作者: 【 】 浏览:536
Tags:计算 气球 半径 相交

    题意:给你N组气球,每组有2个气球,每组要取一个气球,问最后使得N个气球都不相交,则气球半径R最大是多少。

    思路:直接二分半径,然后2-sat判可行性。SCC之后如果有两个同组的点在同一个强联通分量里,那么则不可行。

    这道题注意最后的二分结束之后还要取三位小数,看取了之后是否还是符合情况的,最后的那个 操作是看别人的我WA到死了

    我感觉这题这里太坑了…

    #include <iostream>

    #include <cstdio>

    #include <algorithm>

    #include <string>

    #include <cmath>

    #include <cstring>

    #include <queue>

    #include <set>

    #include <vector>

    #include <stack>

    #include <map>

    #include <iomanip>

    #define PI acos(-1.0)

    #define Max 2505

    #define inf 1《28

    #define LL(x) ( x 《 1 )

    #define RR(x) ( x 《 1 | 1 )

    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )

    #define ll long long

    #define mem(a,b) memset(a,b,sizeof(a))

    #define mp(a,b) make_pair(a,b)

    #define PII pair<int,int>

    using namespace std;

    int t ;

    #define N 2005

    double x[N 《 1] , y[N 《 1] ,z[N 《 1] ;

    struct kdq{

    int e , next ;

    }ed[N * 100] ;

    int head[N] , num ;

    int dfn[N 《 1] , low[N 《 1] ,st[N 《 1] , top , dp ,inst[N 《 1] , ca ,belong[N 《 1] ;

    void add(int s ,int e){

    ed[num].e = e ;

    ed[num].next = head[s] ;

    head[s] = num ++ ;

    }

    void init(){

    mem(head , -1) ;

    num = 0 ;

    mem(dfn ,0) ;

    mem(low, 0) ;

    mem(st ,0) ;

    mem(inst ,0) ;

    mem(belong ,0) ;

    top = dp = ca = 0 ;

    }

    inline double getdis(int i ,int j){

    return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j])) ;

    }

    void tarjan(int now){

    low[now] = dfn[now] = ++ dp ;

    st[top ++] = now ;

    inst[now] = 1 ;

    for (int i = head[now] ; ~i ; i = ed[i].next ){

    int e = ed[i].e ;

    if(!dfn[e]){

    tarjan(e) ;

    low[now] = min(low[now] , low[e])  ;

    }

    else if(inst[e]){

    low[now] = min(low[now] , dfn[e]) ;

    }

    }

    if(low[now] == dfn[now]){

    ca ++ ;

    int xx ;

    do{

    xx = st[-- top] ;

    belong[xx] = ca ;

    inst[xx] = 0 ;

    }while(xx != now) ;

    }

    }

    void build(double mid){

    init() ;

    for (int i = 0 ; i < t ; i ++ ){

    for (int j = i + 1 ; j  < t ; j ++ ){

    if(getdis(LL(i),LL(j)) < mid){

    add(LL(i) , LL(j) ^ 1) ;

    add(LL(j) , LL(i) ^ 1) ;

    }

    if(getdis(LL(i) ,RR(j)) < mid){

    add(LL(i) , RR(j) ^ 1) ;

    add(RR(j) , LL(i) ^ 1) ;

    }

    if(getdis(RR(i) , LL(j)) < mid){

    add(RR(i) , LL(j) ^ 1) ;

    add(LL(j) , RR(i) ^ 1) ;

    }

    if(getdis(RR(i) , RR(j)) < mid){

    add(RR(i) , RR(j) ^ 1) ;

    add(RR(j) , RR(i) ^ 1) ;

    }

    }

    }

    }

    int fuckit(){

     

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一道DP练习题详解 下一篇排序生成最小的数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)