[2-sat]HDOJ3622 Bomb Game

题意:给n对炸弹,每对炸弹选其中一个爆炸。

每个炸弹爆炸的半径相同 圆不能相交, 求最大半径

2-sat简介

二分半径, 枚举n*2个炸弹

若i炸弹与j炸弹的距离小于半径*2 则建边

比如  第一对炸弹的第一个 与 第二对炸弹的第一个 距离小于半径*2

    则 建立 第一对炸弹的第一个$\Rightarrow $第二对炸弹的第二个 、第二对炸弹的第一个$\Rightarrow $第一对炸弹的第二个

然后 通过判断能否取到n个炸弹 来判断 能否取该半径

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef long long LL;
  4 typedef pair<double, double> PI;
  5 const double eps=1e-6;
  6 #define INF 0x3f3f3f3f
  7
  8 const int N=105*2;
  9 const int M=N*N;
 10 //注意n是拆点后的大小 即 n <<= 1 N为点数(注意要翻倍) M为边数 i&1=0为i真 i&1=1为i假
 11 struct Edge
 12 {
 13     int to, nex;
 14 }edge[M];
 15 //注意 N M 要修改
 16 int head[N], edgenum;
 17 void addedge(int u, int v)
 18 {
 19     Edge E={v, head[u]};
 20     edge[edgenum]=E;
 21     head[u]=edgenum++;
 22 }
 23
 24 bool mark[N];
 25 int Stack[N], top;
 26 void init()
 27 {
 28     memset(head, -1, sizeof(head));
 29     edgenum=0;
 30     memset(mark, 0, sizeof(mark));
 31 }
 32
 33 bool dfs(int x)
 34 {
 35     if(mark[x^1])
 36         return false;//一定是拆点的点先判断
 37     if(mark[x])
 38         return true;
 39     mark[x]=true;
 40     Stack[top++]=x;
 41     for(int i=head[x];i!=-1;i=edge[i].nex)
 42         if(!dfs(edge[i].to))
 43             return false;
 44     return true;
 45 }
 46
 47 bool solve(int n)
 48 {
 49     for(int i=0;i<n;i+=2)
 50         if(!mark[i] && !mark[i^1])
 51         {
 52             top=0;
 53             if(!dfs(i))
 54             {
 55                 while(top)
 56                     mark[Stack[--top]]=false;
 57                 if(!dfs(i^1))
 58                     return false;
 59             }
 60         }
 61     return true;
 62 }
 63
 64 PI a[205];
 65 double dis(PI a, PI b)
 66 {
 67     return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));
 68 }
 69
 70 int main()
 71 {
 72     int n;
 73     while(~scanf("%d", &n))
 74     {
 75         for(int i=0;i<n;i++)
 76         {
 77             double x1, y1, x2, y2;
 78             scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
 79             a[i*2]=make_pair(x1, y1);
 80             a[i*2+1]=make_pair(x2, y2);
 81         }
 82         double l=0, r=15000;
 83         while(r-l>=eps)
 84         {
 85             double m=(l+r)/2.0;
 86             init();
 87             for(int i=0;i<n*2;i++)
 88                 for(int j=i+1+!(i&1);j<2*n;j++)
 89                     if(dis(a[i], a[j])<2*m)
 90                     {
 91                         addedge(i, j^1);
 92                         addedge(j, i^1);
 93                     }
 94             if(solve(n*2))
 95                 l=m;
 96             else
 97                 r=m;
 98         }
 99         printf("%.2f\n", r);
100     }
101     return 0;
102 }

HDOJ 3622

时间: 2024-10-27 19:04:34

[2-sat]HDOJ3622 Bomb Game的相关文章

2—SAT问题

现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x] AND A[y]=0.A[x] OR A[y] OR A[z]=1.A[x] XOR A[y]=0等,要确定A[0..N-1]的值,使得其满足所有限制关系.这个称为SAT问题,特别的,若每种限制关系中最多只对两个元素进行限制,则称为2-SAT问题. 对于x.y有11种关系,将其拆点2x(假),2x+1(真).对于x为假或者y为假这样的条件,我们连两条有向边2x+1->2y.2y+1->2x,注意这里是有向边以及边的起点和终点的关

CSAPP 3e: Bomb lab (secret_phase)

这是秘密关卡,需要通过主动调用secret_phase函数才能触发,可以通过call secret 或者jump *0x地址来调用. 贴出函数:(fun7函数部分没有注释,后边续上了手写的图来解析这个函数了) 0000000000401204 <fun7>: 401204: 48 83 ec 08 sub $0x8,%rsp 401208: 48 85 ff test %rdi,%rdi 40120b: 74 2b je 401238 <fun7+0x34>;如果%rdi==0,r

CSAPP 3e: Bomb lab (phase_6)

这一关很复杂,需要非常耐心.如果感觉容易在循环中绕晕,可以参考一下我最后附上的画图分析法2333,小把戏,不过挺有用的. 先看函数phase_6: 00000000004010f4 <phase_6>: 4010f4: 41 56 push %r14 4010f6: 41 55 push %r13 4010f8: 41 54 push %r12 4010fa: 55 push %rbp 4010fb: 53 push %rbx 4010fc: 48 83 ec 50 sub $0x50,%rs

CSAPP 3e: Bomb lab (phase_5)

调出phase_5函数: 0000000000401062 <phase_5>: 401062: 53 push %rbx 401063: 48 83 ec 20 sub $0x20,%rsp 401067: 48 89 fb mov %rdi,%rbx 40106a: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax ;此处搞不懂 401071: 00 00 401073: 48 89 44 24 18 mov %rax,0x18(%rsp) 401078: 31

LA 3211 飞机调度(2—SAT)

https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间为E,晚着陆时间为L,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使得整个着陆计划尽量安全.换句话说,如果把所有飞机的实际着陆时间按照从早到晚的顺序排列,相邻两个着陆时间间隔的最小值. 思路: 二分查找最大值P,每次都用2—SAT判断是否可行. 1 #include<iostream>

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

[HDU3555]Bomb

试题描述 The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power o

HDU 3555 —— Bomb

Bomb Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "4

HDU 5653 Bomber Man wants to bomb an Array. DP

Bomber Man wants to bomb an Array. Problem Description Given an array and some positions where to plant the bombs, You have to print the Total Maximum Impact. Each Bomb has some left destruction capability L and some right destruction capability R wh