ZOJ 3717 Balloon ( TLE )
正解2-SAT。
我用DLX想搜一搜的,结果TLE了……
没什么遗憾,最起码我尝试过了。
扔个代码留作纪念。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm> using namespace std; const int INF = << ;
const int MAXN = ;
const double eps = 1e-; struct Point
{
double x, y, z;
Point( double x = , double y = , double z = ):x(x), y(y), z(z){ }
void readPoint()
{
scanf( "%lf%lf%lf", &x, &y, &z );
return;
}
}; bool mx[MAXN][]; //01矩阵
int C[MAXN*], cnt[];
int U[MAXN*], D[MAXN*];
int L[MAXN*], R[MAXN*];
int head;
int maxr, maxc;
Point P[MAXN];
int N; int dcmp( double a )
{
if ( fabs(a) < eps ) return ;
return a < ? - : ;
} double Dis( Point a, Point b )
{
return sqrt( ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y ) + ( a.z - b.z )*( a.z - b.z ) );
} void Remove( int c )
{
int i, j;
L[ R[c] ] = L[c];
R[ L[c] ] = R[c];
for ( i = D[c]; i != c; i = D[i] )
{
for ( j = R[i]; j != i; j = R[j] )
{
U[ D[j] ] = U[j];
D[ U[j] ] = D[j];
--cnt[ C[j] ];
}
}
return;
} void Resume( int c )
{
int i, j;
R[ L[c] ] = c;
L[ R[c] ] = c;
for ( i = D[c]; i != c; i = D[i] )
{
for ( j = R[i]; j != i; j = R[j] )
{
U[ D[j] ] = j;
D[ U[j] ] = j;
++cnt[ C[j] ];
}
}
return;
} bool DFS( int cur )
{
int i, j, c, minv; if ( cur > N ) return false;
if ( R[head] == head )
{
if ( cur == N )
return true;
return false;
} minv = INF;
for ( i = R[head]; i != head; i = R[i] )
{
if ( cnt[i] < minv )
{
minv = cnt[i];
c = i;
}
} Remove(c);
for ( i = D[c]; i != c; i = D[i] )
{
for( j = R[i]; j != i; j = R[j] )
Remove( C[j] ); if ( DFS( cur + ) ) return true; for( j = R[i]; j != i; j = R[j] )
Resume( C[j] );
} Resume(c);
return false;
} bool build()
{
int i, j, cur, pre, first;
head = ;
for ( i = ; i < maxc; ++i )
{
R[i] = i + ;
L[i + ] = i;
}
R[ maxc ] = ;
L[] = maxc; //列双向链表
for ( j = ; j <= maxc; ++j )
{
pre = j;
cnt[j] = ;
for ( i = ; i <= maxr; ++i )
{
if ( mx[i][j] )
{
++cnt[j];
cur = i * maxc + j; //当前节点的编号
C[cur] = j; //当前节点所在列
D[pre] = cur;
U[cur] = pre;
pre = cur;
}
}
U[j] = pre;
D[pre] = j;
if ( !cnt[j] ) return false; //一定无解
} //行双向链表
for ( i = ; i <= maxr; ++i )
{
pre = first = -;
for ( j = ; j <= maxc; ++j )
{
if( mx[i][j] )
{
cur = i * maxc + j;
if ( pre == - ) first = cur;
else
{
R[pre] = cur;
L[cur] = pre;
}
pre = cur;
}
}
if ( first != - )
{
R[pre] = first;
L[first] = pre;
}
}
return true;
} /**************以上DLX模板*****************/ void show()
{
for ( int i = ; i <= maxr; ++i )
{
for ( int j = ; j <= maxc; ++j )
printf( "%d", mx[i][j] );
puts("");
}
puts("---------");
return;
} //得到该情况下的01矩阵
void init( double R )
{
memset( mx, false, sizeof(mx) ); for ( int i = ; i <= maxr; ++i )
{
mx[i][i] = true;
if ( i % )
{
//printf("ii %d %d\n", i, i + 1);
mx[i][N + N + i/+] = true;
mx[i + ][N + N + i/+] = true;
}
for ( int j = ; j <= maxr; ++j )
{
//printf("i=%d j=%d\n", i, j );
if ( dcmp( Dis( P[i], P[j] ) - 2.0 * R ) < )
mx[j][i] = true;
}
}
//show();
return;
} bool ok( double mid )
{
init( mid );
if ( build() == false ) return false;
if ( DFS( ) == false ) return false;
return true;
} double solved()
{
double l = ;
double r = Dis( Point(, , ), Point( , , ) );
double ans;
while ( dcmp( r - l ) > )
{
double mid = ( l + r ) / 2.0;
//printf( "mid = %.6f\n", mid );
if ( ok( mid ) )
{
l = mid;
ans = mid;
}
else r = mid;
}
return ans;
} int main()
{
//freopen( "in.txt", "r", stdin );
//freopen( "out.txt", "w", stdout );
while ( scanf( "%d", &N ) == )
{
maxr = ;
for ( int i = ; i < N; ++i )
{
P[++maxr].readPoint();
P[++maxr].readPoint();
}
maxc = maxr + N;
double ans=(int)(solved()*+0.5+eps)/1000.0;
if ( !ok(ans) ) ans -= 0.001;
printf( "%.3f\n", ans );
}
return ;
}
ZOJ 3717 Balloon ( TLE )的更多相关文章
- zoj 3717 - Balloon(2-SAT)
裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...
- zoj 3981 Balloon Robot
https://vjudge.net/problem/ZOJ-3981 题意: 有m个座位,其中n个队伍坐在这些位置上,一个队伍一个座位.当一个队A了题之后,他们们会得到气球,假设他们在a时刻A题,但 ...
- ZOJ 3717 二分+2-sat判定。
好久没有2-sat了,此题当复习之用,二分求最大值+2-sat判断可行,此题主要跪于题意:The results should be rounded to three decimal places. ...
- ZOJ - 3981 - Balloon Robot (思维)
参考自:https://blog.csdn.net/qq_36553623/article/details/78445558 题意: 第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q ...
- ZOJ 3717
这题是二分+2SAT. 总结一下SAT题的特征.首先,可能会存在二选一的情况,然后会给出一些矛盾.据这些矛盾加边,再用SAT判定. 这一道题好像不能直接用printf("%0.3lf&quo ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- ZOJ 3981 && 2017CCPC秦皇岛 A:Balloon Robot(思维题)
A - Balloon Robot Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Sub ...
- POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
http://poj.org/problem?id=2240 用log化乘法为加法找正圈 c++ 110ms,g++tle #include <string> #include <m ...
- zoj 2104 Let the Balloon Rise(map映照容器的应用)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...
随机推荐
- C-net总结
SMB服务器信息块 DHCP动态主机配置协议 STMP简单邮件传输协议 POP(邮件协议) Gnutella 网络分析数据 nslookup DNS(域名系统) 请求注释(RFC)文件 ...
- LVS基于NAT模式搭建负载均衡群集
LVS的基本架构图 负载均衡群集中,包括三个层次的组件: 1.第一层,负载调度器(BL) 前段至少有一个负载调度器(Load Balancer 或称为Director)负责响应并分发来自客户端的访问请 ...
- php红包算法函数[优化]
php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...
- 区分js中的null,undefined,"",0和false
console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof " ...
- 2.1 <script>元素【JavaScript高级程序设计第三版】
向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素.这个元素由 Netscape 创造并在 Netscape Navigator 2 中首先实现.后来 ...
- Qt的QWebChannel和JS、HTML通信/交互驱动百度地图
Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...
- 华为模拟器ensp安装教程
华为模拟器说实话有时候真的是很烦人,总是莫名其妙的出问题,而且网上教程一般也解决不了 因此我认为学会ensp的重装真的很重要,因此只要我们删除干净了,安装最多花不了20分钟的时间 接下来我就来说说怎么 ...
- C语言基础篇(三) 指针
导航: 1.指针 2. 数组 3. 结构体,共用体 4. 内存分布图 5. 段错误分析 ----->x<------------->x<---- ...
- [CodeForces954D]Fight Against Traffic(最短路)
Description 题目链接 Solution 从起点和终点分别做一次最短路并记录结果 枚举每一条可能的边判断 Code #include <cstdio> #include < ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
本篇目的:封装一些抽象类 1::封装日志相关类 2:封装一个Service操作类 3:封装缓存操作类 4:封装其他一些常用Helper 1.1在Framework项目里面建立好相关操作类文件夹,以便于 ...