• 【BZOJ-2864】战火星空 计算几何 + 最大流


    2864: 战火星空

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 33  Solved: 14
    [Submit][Status][Discuss]

    Description

    APIO回来之后,XX便迷上了“战火星空”这个游戏。

    原版战火星空中,有一架小飞机和一个Boss,玩家控制小飞机来对Boss进行射击。然而,这种“一对一”的游戏已经让XX乏味,于是XX基于原版战火星空,将其加强创造了一款新版战火星空。

    新版战火星空中,有N个Boss和M架小飞机。在游戏过程中,Boss的位置不会改变,而小飞机在从(Sx, Sy)到(Ex, Ey)的线段以速度V匀速飞行,并在到达终点后从地图上消失;小飞机的子弹具有R的射程,在任意时刻,小飞机可以向在射程内的Boss射击;而为了使实力更加均衡,游戏还规定在任意时刻,每个Boss只能被一架小飞机作为目标射击;每架小飞机也有一个能量值E的限制,若某时刻小飞机向K个Boss射击,则每秒需要消耗K个单位的能量,所有能量消耗完之后小飞机不再能够进行射击。

    在游戏开始前,XX知道了所有Boss的位置,以及每架小飞机的飞行路线以及各项属性,他想知道所有Boss被攻击的总时间最大是多少,你能帮助他吗?

    Input

    第一行包含两个整数N,M,分别表示Boss和小飞机的个数。

    接下来N行,每行一个正整数点坐标(x, y),表示Boss所在的位置。

    接下来M行,每行七个正整数:Sx, Sy, Ex, Ey, V, R, E,表示每架小飞机的运动路线、速度、射程以及能量值。

    Output

    输出一个实数,表示所有Boss被攻击的最大总时间,保留6位小数。

    Sample Input

    样例1:
    1 1
    2 2
    1 1 5 3 2 1 2

    样例2:
    2 4
    12 10
    7 5
    10 10 12 10 1 1 3
    6 1 8 10 1 2 3
    3 6 8 2 5 3 1
    42 42 42 42 6 6 6

    Sample Output

    样例1:

    0.894427

    样例2:

    4.983771

    HINT

    对于30%的数据,保证每个Boss在任意时刻只在最多一架小飞机的射程范围内。对于100%的数据,1≤N,M≤20,输入的所有数均为正整数,且不超过1000。

    Source

    Solution

    计算几何+网络流..

    网络流的部分比较简单,就是S到每个飞机连容量,每个能攻击到boss的时间段连T,容量为时间长度,然后由飞机向时间段连边即可。

    这里只要求出对于每个boss每个飞机能攻击到的时间段即可。

    飞机的飞行路线是一条线段,攻击范围是一个半径为r的圆,那么其实可以枚举每个boss,以boss为圆心求出与这条线段的交点,进而求出可攻击时间。

    圆和线段求交就可以直接利用法向量求出垂足,然后勾股求出距离之后,特判一下方向什么的就可以了,然后在和这个飞机的最短最长时间取一下交就可以了。

    Code

  • 相关阅读:
    [OpenCV]基于arm64和Python2、Python3的opencv-python-contrib编译
    [Jupyter_Notebook]Windows下Jupyter-Notebook更换默认目录
    【Vmware】NAT模式下网络无法连接
    COCO数据集转mask
    [COCO数据集]关于instances中的分割信息按部分类别进行获取及保存
    Leetcode147-对链表进行插入排序(Python3实现)
    Leetcode1415-长度为 n 的开心字符串中字典序第 k 小的字符串(Python3实现)
    Leetcode1353-最多可以参加的会议数目(Python3实现)
    RabbitMQ 官方NET教程(六)【RPC】
    RabbitMQ 官方NET教程(五)【Topic】
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/6808021.html
Copyright © 2020-2023  润新知