UVa1318/LA2797 Monster Trap

2024-01-20 16:52
文章标签 trap monster uva1318 la2797

本文主要是介绍UVa1318/LA2797 Monster Trap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

         本题是2003年ICPC亚洲区域赛会津(日本)赛区的H题

题意

        给出一些线段障碍,你的任务是判断怪物能否逃到无穷远处。如下图所示,左图无法逃出,右图的可以逃出。

        输入包含多组数据。每组数据第一行为整数n(1≤n≤100),即线段条数。以下n 行每行4 个整数,即一条线段两端的坐标。假定线段的长度均为正,坐标绝对值不超过50。假设任意两条线段最多只有一个公共点,无三线共点。任意两个交点的距离大于1e-5。输入结束标志为n=0。        

分析

       《训练指南》上的例题,按照其题解做,发现一个套模板的坑点:本题卡阈值!

        这里给出《训练指南》代码仓库上的源码(第10行)来说明坑点:

const double eps = 1e-12;

        如过把eps改为大于1e-12或者小于1e-14的值(比如1e-111e-15)再提交则WA,而eps写成1e-121e-131e-14则AC。

        根本原因在《训练指南》给出的计算几何模板里面的dcmpSegmentProperIntersectionOnSegment三个函数这里。

int dcmp(double x) {return abs(x) < eps ? 0 : (x < 0. ? -1 : 1);
}bool SegmentProperIntersection(const Point& a1, const Point& a2, const Point& b1, const Point& b2) {double c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1);double c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}bool OnSegment(const Point& p, const Point& a1, const Point& a2) { // 不含端点return dcmp(Cross(a1 - p, a2 - p)) == 0 && dcmp(Dot(a1 - p, a2 - p)) < 0;
}

        OnSegment函数对dcmp的阈值eps要求低一些(不可太大也不可太小,中间范围即可),但本题的做法涉及把每条线段两端延长一点点(按题意延长量为1e-6合适,因为题木交代两个交点的距离在1e-5量级以上),这样就导致SegmentProperIntersection里面叉乘的结果可能很小,极端数据会小于eps。

        说一下解决方案:SegmentProperIntersection里面对叉乘直接判断符号,不用阈值。

int sign(double x) {return x==0. ? 0 : (x < 0. ? -1 : 1);
}bool SegmentProperIntersect(const Point& a1, const Point& a2, const Point& b1, const Point& b2) {double c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1);double c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);// return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;// 部分卡精度的题目需要直接判断正负号return sign(c1) * sign(c2) < 0 && sign(c3) * sign(c4) < 0;
}

        附一份测试数据和用python写的画图可视化分析数据的脚本方便读者debug。

AC代码

#include <iostream>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;#define eps 1e-10
struct Point {double x, y;Point(double x = 0, double y = 0): x(x), y(y) {}void Normalize() {double l = sqrt(x*x + y*y); x /= l; y /= l;}
};
typedef Point Vector;Vector operator+ (const Vector& A, const Vector& B) {return Vector(A.x + B.x, A.y + B.y);
}Vector operator- (const Vector& A, const Vector& B) {return Vector(A.x - B.x, A.y - B.y);
}Vector operator* (const Vector& A, double p) {return Vector(A.x * p, A.y * p);
}bool operator< (const Point& a, const Point& b) {return a.x < b.x || (a.x == b.x && a.y < b.y);
}double Cross(const Vector& A, const Vector& B) {return A.x * B.y - A.y * B.x;
}double Dot(const Vector& A, const Vector& B) {return A.x * B.x + A.y * B.y;
}int dcmp(double x) {return abs(x) < eps ? 0 : (x < 0. ? -1 : 1);
}int sign(double x) {return x==0. ? 0 : (x < 0. ? -1 : 1);
}bool SegmentProperIntersect(const Point& a1, const Point& a2, const Point& b1, const Point& b2) {double c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1);double c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);return sign(c1) * sign(c2) < 0 && sign(c3) * sign(c4) < 0;
}bool OnSegment(const Point& p, const Point& a1, const Point& a2) {return dcmp(Cross(a1 - p, a2 - p)) == 0 && dcmp(Dot(a1 - p, a2 - p)) < 0;
}#define N 205
Point p[N]; int x[N], q[N], n, t; bool vis[N];bool NotOnAnySegment(const Point& x) {for (int i=0; i<n; ++i) if (OnSegment(x, p[i], p[i+n])) return false;return true;
}bool NotIntersectWithAnySegment(int u, int v) {for (int i=0; i<n; ++i) if (SegmentProperIntersect(p[i], p[i+n], p[u], p[v])) return false;return true;
}bool solve() {memset(vis, t = 0, sizeof(vis));for (int i=0; i<n; ++i) {cin >> p[i].x >> p[i].y >> p[i+n].x >> p[i+n].y;Vector v = p[i+n] - p[i]; v.Normalize(); v = v*1e-6;p[i].x -= v.x; p[i].y -= v.y; p[i+n].x += v.x; p[i+n].y += v.y;}p[n<<1].x = p[n<<1].y = 0.; p[(n<<1)+1].x = -60.; p[(n<<1)+1].y = 60.; x[t++] = n<<1; x[t++] = (n<<1)+1;for (int i=0; i<n; ++i) {if (NotOnAnySegment(p[i])) x[t++] = i;if (NotOnAnySegment(p[i+n])) x[t++] = i+n;}int head = 0, tail = 1; q[0] = 0;while (head < tail) {int u = q[head++];for (int v=1; v<t; ++v) if (!vis[v] && NotIntersectWithAnySegment(x[u], x[v])) {if (v == 1) return false;vis[q[tail++] = v] = 1;}}return true;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n && n) cout << (solve() ? "yes" : "no") << endl;return 0;
}

这篇关于UVa1318/LA2797 Monster Trap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626684

相关文章

linux跳板机开发之trap信号机应用

场景1:公司新招聘了一个配置管理员,他的工作是负责将公司开发人员写的新代码依次分发到办公室测试环境、IDC测试环境和正式线上环境。因此公司需要开发一个程序,当配置管理员登录服务器,只能进入分发的管理界面,无法进行其他操作或直接进入bash界面。   场景2:公司有大量的服务器,我们不能让每个人用root用户登录服务器,这样很危险。但我们又不能再每一台服务器上为所有人创建登录账户,这样管理起来

测试cuda trap指令在cuda-gdb下的行为

测试cuda trap指令在cuda-gdb下的行为 1.测试小结2.测试步骤 本文测试cuda trap指令在cuda-gdb下的行为) 1.测试小结 cuda-gdb遇到trap指令后,当前的warp会停住运行continue后,可以继续运行下一条指令仅当前的warp会被停住,其它warp正常执行(通过cuda-gdb的代码行号以及kernel里的加时间戳可以判断) 2.

error: Abort trap: 6 (in target ‘xxx‘ from project ‘Pods‘)

将Xcode升级到13.3后,对项目打包时报错。 以SKPhotoBrowser的报错举例: 报错: error: Abort trap: 6 (in target 'SKPhotoBrowser' from project 'Pods') remark: Incremental compilation has been disabled: it is not compatible wit

hdu3979_Monster

这是一个解法很简单,但是需要仔细考虑的问题。开始的时候可能会认为是攻击力越高越先处理。但是仔细考虑之后贪心点不仅仅由攻击力决定,还要它的生命值同时决定。勇士在攻击一个怪兽的同时别的怪兽也在攻击勇士,他们的伤害也在叠加。所以优先消灭的怪兽有两个因素同时的决定即有怪兽的攻击力和生命值的比值决定,攻击和生命值比值高的怪兽需要先处理掉。同时要注意此题的结果的取值范围。最终的结果需要使用long long型

什么是Trap消息?

用一句话来说的话,SNMP Trap就是被管理设备主动发送消息给NMS的一种机制。         当被管理设备出现性能问题,甚至是网络设备接口宕掉问题时,Agent需要主动发送消息通知NMS。假如在特定事件出现时,不是由Agent 主动通知NMS,那么NMS必须不断地对Agent 进行轮询,这是非常浪费计算资源的方法。正如人们用中断通知CPU数据的到达,而不是让CPU 进行轮询

(P7)shell编程入门第7讲:函数:字符串操作 ,一些内置命令:expr、shift、eval、trap等 ,Shell内置命令总结

文章目录 1.函数的使用2.字符串操作3.一些内置命令:expr、shift、eval、trap等4.Shell内置命令总结 1.函数的使用 和其它编程语言一样,Bash也可以定义函数一个函数就是一个子程序,用于完成特定的任务,当有重复代码,或者一个任务只需要很少的修改就被重复几次执行时,这时你应该考虑使用函数函数的一般格式为 function function_name{

xcode8.2 cocoapods install第三方库 遇到Abort trap :6 的问题 的解决办法

问题: 我的Xcode是8.2.1, 通过cocoapods安装第三方库的时候遇到 Abort trap: 6 问题。 解决办法: 通过  命令   pod --version   得到我的cocospods的版本是1.0.1 执行:  sudo gem install cocoapods --pre 将cocoapods的版本升级到 1.2.0.beta.1

【OS】AUTOSAR OS系统调用产生Trap的过程详解

目录 前言 正文 1.Os_Hal_Trap使用示例 2. Os_Hal_Trap的定义 3. syscall详解详解

记一次洛谷刷题让人摸不到头脑的报错——Runtime Error.Received signal 6: Aborted / IOT trap.

报错题目 外星密码 - 洛谷 具体报错信息 Runtime Error.Received signal 6: Aborted / IOT trap. 错误代码 #include <iostream>#include <cstring>using namespace std;string sol() {string s = "";string t = "";char c = '

2020ICPC 南京 Monster Hunter(树形依赖背包)

好久没写树形DP手生疏了。 题意: 每个点权值为 h p [ x ] + h p [ v ] hp[x]+hp[v] hp[x]+hp[v],其中 v v v是 x x x的儿子。你可以删掉 m m m个点,求对于 0 ≤ m ≤ n 0≤m≤n 0≤m≤n的每个 m m m能得到的最小权值和。 思路: 定义 d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0/1] dp