Sicily 2016. Emergent escape



题目



思路

忽然发现小号里有这个代码,然后大号没有做。

思路忘记了,这代码应该是别人的,好像是书上的。

注释解释得也挺清楚了。



代码

#include<stdio.h>
#include<math.h>
#include<string.h>

const int maxn = 1000 + 10; //最大陨石数
const double eps = 1e-8; //控制精度
const double pi = acos(-1.0);//圆周率

double d1, d2, R; //起点和终点弧度,太空船半径
double xd1, yd1, xd2, yd2; //起点和终点坐标。
int n; //陨石数目
double x[maxn], y[maxn], r[maxn]; //陨石圆心坐标和半径
int a[maxn][maxn]; //无向图
int b[maxn]; //陨石与太空船相交标记
int cas;

inline double dis(double x, double y){
    //计算向量长度
    return sqrt(x * x + y * y);
}

inline double helen(double a, double b, double c){
    double p = (a + b + c) / 2.0;
    //海伦公式计算长度为a、b、c的三角形面积
    return sqrt(p * (p - a) * (p - b) * (p - c));
}

int intersect(int i, int j){
    //利用面积判断第i个圆和第j个圆的交点是否在太空船内
    //计算边长
    double di = dis(x[i], y[i]);
    double dj = dis(x[j], y[j]);
    double ij = dis(x[i] - x[j], y[i] - y[j]);
    //计算4个三角形的面积
    double S = helen(di, dj, ij);
    double Si = helen(di, r[i], R);
    double Sj = helen(dj, r[j], R);
    double Sij = helen(ij, r[i], r[j]);
    //利用这4个三角形的面积来判断
    return Si + Sj + Sij > S;
}

int dfs(int root){
    //深度优先遍历
    if (b[root] == 2) return 0; //找到一个标记为2的结点则返回
    b[root] = 0; //标记
    int i;
    for (i = 0; i < n; i++) if (b[i] && a[root][i] == cas) {
        if (dfs(i) == 0) return 0; //如果没访问过则进行访问
    }
    return 1;
}

int main(){
    //读入数据组数
    int T;
    scanf("%d", &T);
    double tmp, d, di; //临时变量
    int ok; //可行标记
    int i, j; //循环变量
    memset(a, 0, sizeof(a)); //对a清零
    cas = 0; //数据序号
    while (T--) {
        cas++;
        scanf("%lf%lf%lf", &R, &d1, &d2); //读入半径
        //交换以保证d1 <= d2
        if (d1 > d2) {
            tmp = d1;
            d1 = d2;
            d2 = tmp;
        }
        //角度化成弧度
        d1 = pi / 180.0 * d1;
        d2 = pi / 180.0 * d2;
        //起点和终点坐标
        xd1 = R * cos(d1);
        yd1 = R * sin(d1);
        xd2 = R * cos(d2);
        yd2 = R * sin(d2);
        //读入陨石坐标
        scanf("%d", &n);
        for (i = 0; i < n; i++) scanf("%lf%lf%lf", &x[i], &y[i], &r[i]);
        ok = 1;
        memset(b, 0, sizeof(b)); //清空b数组
        for (i = 0; i < n; i++) {//遍历陨石
            d = dis(x[i], y[i]); //计算距离
            if (d > R + r[i] + eps) { //相离,标记为0
                b[i] = 0;
                continue;
            }
            if (r[i] + d + eps < R) { //相含,标记为3
                b[i] = 3;
                continue;
            }
            //陨石直接撞到起点或者终点
            if (dis(x[i] - xd1, y[i] - yd1) <= eps + r[i] ||
                dis(x[i] - xd2, y[i] - yd2) <= eps + r[i]){
                ok = 0; //无解
                continue;
            }
            //计算圆心弧度
            di = acos(x[i] / d);
            if (y[i] < 0.0) di = pi + pi - di;
            //判断相交于哪个区间
            if (di > d1 && di < d2) b[i] = 1;
            else b[i] = 2;
        }
        if (!ok) {
            //如果陨石直接撞到起点或终点
            printf("Die hard!\n");
            continue;
        }
        //否则进行遍历
        for (i = 0; i < n; i++) if (b[i])
            for (j = i + 1; j < n; j++) if (b[j])
                if (dis(x[i] - x[j], y[i] - y[j]) <= r[i] + r[j]) {
                    if (b[i] + b[j] != 3 || intersect(i, j))
                        //如果两个陨石相交则连边
                        a[i][j] = a[j][i] = cas;
                }
        //对每一个标记为1的点开始遍历,看能否到达标记为2的点
        for (i = 0; i < n; i++) {
            if (b[i] == 1) ok = dfs(i);
            if (!ok) break;
        }
        //输出判定结果
        if (ok) printf("Escape!\n");
        else printf("Die hard!\n");
    }
    return 0;
}
时间: 2024-10-30 00:17:53

Sicily 2016. Emergent escape的相关文章

中山大学校队选拔赛第一章题1【紧急逃离Emergent escape】----2015年1月26日

一: 题意描述 二:题目分析 本题的大致意思是讲:在给定的一个大圆上挖去很多圆(这些圆有的在大圆里面,有的在大圆外面,有的与圆相加),凡是被圆占据的部分则不能通行. 现在给定两个点,(lifeship和controlling room)如果两者能够到达的话表示能够Escape,否则就只有Die hard. 本题的主要考查图论知识和计算几何方面的知识.首先我们对于这个问题需要建模.我们首先可以把这个大圆看成单独的一个区域.现在的问题就是在整个大圆内找不到一条线可以让lifeship和control

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R

2016弱校联萌十一专场10.3 遗憾题合集

http://acm-icpc.aitea.net/index.php?2016%2FPractice%2F%E6%A8%A1%E6%93%AC%E5%9C%B0%E5%8C%BA%E4%BA%88%E9%81%B8%2F%E8%AC%9B%E8%A9%95 C.We don't wanna work! @siludose 你要的代码,做好了参考看 SB模拟,xjb模拟 #include <iostream> #include <algorithm> #include <st

WebStorm 2016.3 EAP, 163.3512 更新

WebStorm 2016.3 EAP, 163.3512 更新了,本次更新对Docker提供了支持,以及采用新的字体(腾云科技ty300.com).WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具(勤快学qkxue.net). 一些新特性: Feature WEB-22928 Flow: provide Flow View to list current and project errors.Feature WEB-22930 Flow: provid

Summary of Critical and Exploitable iOS Vulnerabilities in 2016

Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong, Eakerqiu @ Team OverSky 0x00 Introduction iOS security is far more fragile than you believe. And there are lots of critical and exploitable iOS vuln

Escape from the Hell

Escape from the Hell [JAG Asia 2016] 容易证明优先选择差值大的更优 对于最后一瓶我们可以枚举 枚举最后一瓶,然后在树状数组上消去它的影响,然后线段树check是否出现被追上的情况,即查询区间最小值. 需要用到两个线段树,因为当二分找到的位置在最后一瓶后面,需要在线段树上消去最后一瓶的影响. 特别注意当差值为负数的时候前缀和就没有单调性了,所以二分要在单调递增区间二分. #include <bits/stdc++.h> #define ll long long

# [0CTF 2016]piapiapia解题详细思路及复现

[0CTF 2016]piapiapia解题详细思路及复现 题目链接 https://buuoj.cn/challenges#[0CTF%202016]piapiapia 1. 知识点 信息泄露 参数传递数组绕过字符串检测 反序列化字符逃逸 2. 开始复现 2.1 初探题目 开打题目连接我们可以看到是一个登录页面 不知道为啥我一看到登录页面就想SQL注入一波,我还是太年轻了.这道题没有给出提示,SQL注入也不是没有可能,尝试一波之后放弃了,CTF直接登录框就注入的还是不多. 注册账号 看来我们还

爱奇艺、优酷、腾讯视频竞品分析报告2016(一)

1 背景 1.1 行业背景 1.1.1 移动端网民规模过半,使用时长份额超PC端 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>,报告显示,网民的上网设备正在向手机端集中,手机成为拉动网民规模增长的主要因素.截至2015年12月,我国手机网民规模达6.20亿,有90.1%的网民通过手机上网. 图 1  2013Q1~2015Q3在线视频移动端和PC端有效使用时长份额对比 根据艾瑞网民行为监测系统iUserTracker及mUserTrac