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 ...
随机推荐
- N76E003---输入捕获
输入捕获 根据芯片手册,定时器2可以作为输入捕获使用,设置非常简单,官方也提供了宏给我们使用 void Time2_cap_init(void) { /******* 输入捕获CF设置 ******* ...
- prepareStatament和Statement和callableStatement的区别
关系与区别 Statement.PreparedStatement和CallableStatement都是接口(interface) Statement 1.Statement接口提供了执行语句和获取 ...
- P3740 贴海报
P3740 贴海报 很显然,这个题是让我们维护一个区间的信息 可以考虑线段树.可是这个题,正向思维可能并不可做. 所以我们考虑逆向思维. 打个比方,你是一名保洁人员.面对已经粘在墙上的,大大小小的广告 ...
- poj_3696_The Luckiest number
Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...
- Intellij IDEA 像eclipse那样给maven添加依赖,且Intellij idea里在pom.xml里添加Maven依赖,本地仓库下拉列表显示包很少的血的经验
打开pom.xml,在它里面使用快捷键:ALT+Insert ————>点击dependency 再输入想要添加的依赖关键字,比如:输个spring 出现下图: 根据需求选择版本,完成以后 ...
- 神经网络系列学习笔记(一)——神经网络之ANN学习资料汇总
ANN tutorial: http://adventuresinmachinelearning.com/neural-networks-tutorial/ https://www.cs.toront ...
- Ajax上传文件/照片时报错TypeError :Illegal invocation
问题 Ajax上传文件/照片时报错TypeError :Illegal invocation 解决 网上搜索问题,错误原因可能有以下几个,依次检查: 请求类型有误,如post请求,但在后台设置的是ge ...
- (转)Clang 比 GCC 编译器好在哪里?
编译速度更快.编译产出更小.出错提示更友好.尤其是在比较极端的情况下.两年多前曾经写过一个Scheme解释器,词法分析和语法解析部分大约2000行,用的是Boost.Spirit--一个重度依赖C++ ...
- float 浮动详解
浮动(float):浮动原先设定时主要是用于文本环绕图像设定的,后来发现其在css布局中有很大的帮助,故渐渐使用浮动. 浮动后的元素脱离了文档的普通流,使得浮动的元素不占据文档的位置,其他元素可以覆盖 ...
- Java中的二进制运算出错问题
问题: 最近在做Java web项目中需要计算金额总和,在这里出现了一个问题是我以前没有关注到的: System.out.println(2.0-1.1); 执行时候的console中打印输出的是 0 ...